目录

  • 1、流程控制
    • (1) if语句
    • (2) 循环语句
  • 2、运算
    • (1) 数值运算
    • (2) 向量运算
    • (3) NA处理
  • 3、定义函数
    • (1) 可变长函数
    • (2) 嵌套函数
  • 4、作用域
  • 5、对象的不变性
  • 6、队列

1、流程控制

(1) if语句

ifelse()函数根据给定test值的真假,返回yes或no值。

ifelse(test,    #保存真假值的对象yes,     #test为真时,选择该值no       #test为假时,选择该值
)
# 例如
x <- c(1,2,3,4,5)
ifelse(x %% 2 == 0,"even","odd")

[1] “odd” “even” “odd” “even” “odd”

(2) 循环语句

R中的循环语句分为for、while和respeat。

语法 含义
for ( i in data) { 使用i的语句 } 将data中的各值分别赋予变量i,同时针对每个i执行语句块中的语句
while (ond) { cond为真时要执行的语句} 不断判断条件的cond的真假,条件cond为真时,执行{}中的语句,直到cond为假,退出循环
repeat { 要循环执行的语句 } 反复执行{}中的语句,直至遇到退出条件。类似于其他语言中的do-while

循环语句中,使用break与next语句可以调整循环语句的执行流程。

  • break:退出循环语句。
  • next:终止当前正在执行的语句块,进入下一循环。

2、运算

(1) 数值运算

运算符与函数 含义
+,-,*,/ 四则运算
n %% m 求n/m的余数
n %/% m 求n/m的商
n^m 求n的m次方
exp(n) 求e的n次方
log(x,base=exp(1)) 求logbase(x)。若不指定base,则计算loge(x)
log2(x),log10(x) 分别计算log2(x)和log10(x)
sin(x),cos(x),tan(x) 三角函数

(2) 向量运算

借助向量运算可以很容易地从数据框中保存的数据获取所需信息,其基本原理是通过向量数据框指定逻辑值以获取特定行。例如,

d <- data.frame(x=c(1,2,3,4,5),y=c("a","b","c","d","e"))
d[c(TRUE,FALSE,TRUE,FALSE,TRUE),]

x  y
    1  1  a
    3  3  c
    5  5  e
        因此,只要通过向量运算构建行选择标准TRUE和FALSE,即可选定特定行。例如,下列示例选择x为偶数的行:

d[d$x %% 2 == 0,]

x  y
    2  2  b
    4  4  d

(3) NA处理

数据包含NA时,运算结果都会变为NA。为了解决这一问题,R中许多函数都接受na.rm作为参数。数据包含NA时,使用na.rm指定是否要将NA值从运算中排除。

sum(c(1,2,3,NA))

[1] NA

sum(c(1,2,3,NA),na.rm=TRUE)

[1] 6
        常见的NA处理函数:

函数 含义
na.fail(object,…) 若object中包含NA,则失败
na.omit(object,…) 若object中包含NA,则排除含有NA的行
na.exclude(object,…) 若object中包含NA,则排除,这与na.omit相同。但使用naresid、napredict的函数中,通过NA排除的行会再次添加到结果
na.pass(object,…) 即使object中包含NA,也使之通过
  • na.omit与na.exclude的差异
    假设有如下含有NA值的数据框。
df <- data.frame(x=1:5, y=seq(2,10,2))
df [3, 2]=NA
df

X   Y
    1  1   2
    2  2   4
    3  3  NA
    4  4   8
    5  5  10
        假设这些数据遵循y=ax+b的线性模型,该模型可以使用线性回归函数lm()创建。若向创建的模型应用resid()函数,则可以求取线性模型的预测值与实际y值之间的残差(residual)。(有关线性回归、lm、resid函数的内容将在第8章讲解。)
        lm()函数带有na.action参数,该参数值不同,处理含有NA值的行的方法也不同。比如,若设置na.action=na.omit,则建模时含有NA值的第3行就被排除。因此,虽然df共有5行数据,但resid()的结果共有4个值,如下所示。

resid(lm(y ~ x, data=df, na.action=na.omit))

1                      2                       4                       5
    -2.982647e-16  3.439354e-16  1.612526e-16  -2.069233e-16
        若设置na.action =na.exclude,建模时含有NA的行仍然会被排除。但求残差时,含有NA的行的残差会在结果中显示,并记作NA。因此,resid()的结果长度与原数据长度是一致的。

resid(1m(y -x, data=df, na.action=na.exclude))

1                      2                      3                       4                       5
    -2.982647e-16  3.439354e-16                   NA  1.612526e-16  -2.069233e-16

3、定义函数

R中定义函数的方法与其他编程语言中的类似,但也有如下几点不同。首先,返回值时要使用类似函数调用的形式“return(返回值)”,而非“return返回值”。其次,若省略return(),则函数最后一条语句的返回值即为整个函数的返回值。利用这一特征可以重写上述fibo()函数,如下所示。

fibo <- function(n) {if (n == 1 || n == 2) {1} else {fibo(n-1) + fibo(n-2)}
}

(1) 可变长函数

在R函数的帮助中,常常会看到参数列表中含有…。一方面,…表示函数的参数个数未知;另一方面,它也表示要传递给(在函数内部调用的)其他函数的参数。下列是可变长参数…的使用示例。函数f的定义中,使用…作为参数,将其逐个输出到屏幕。

 f <- function(...){args <- list(...)for (a in args){print(a)}
}f('3','4')

[1] “3”
    [1] “4”

(2) 嵌套函数

借助嵌套函数可以提取某个函数内部要反复执行的一些操作,以形成一个函数。需要执行这些操作时,只需调用构建好的嵌套函数。这不仅能使代码变得简洁,也会让使用变得更简单。此外,由于内部函数也可以访问外部函数定义的变量,所以常用作闭包(closure)。

fc- function(x1){return(function(x2) {return(x1 +x2)})
}
g<-f(1)
g(2) #x1 = 1,x2= 2

[1] 3

g2 <- f(2)
g2(2) #x1= 2,x2 = 2

[1] 4
        如上代码所示,函数g()中,x1=1;函数g20中,x1=2,所以g(x2)计算的是1+x2,而g2(x2)计算的是2+x2。

4、作用域

rm()删除指定环境中的对象;ls()返回对象名称。

rm( …,                       #待删除的对象列表list=character(),         #含有待删除对象的向量envir=as.environment(pos) #待删除对象的环境
)
ls(name,    #对象所在环境的名称envir    #代替name直接设置环境
)            #返回值是包含对象名称的字符串向量。

使用rm(list=ls())命令可以删除内存中的所有对象。
        若想在函数中为变量或全局变量赋值,则应使用<<-运算符。

b <- 0
f <- function(){a <- 1g <- function(){a <<- 2b <<- 2print(a)print(b)}g()print(a)print(b)
}
f()

[1] 2
    [1] 2
    [1] 2
    [1] 2

5、对象的不变性

对象复制追踪函数

函数 含义
tracemen(x) 对对象复制进行追踪
untracemen(x) 取消对象复制追踪

6、队列

队列是一种“先进先出”(First In First Out, FIFO)的数据结构。可以将队列视为一个个人依次排成的一个队伍,处理事情时总先从站在队首的人开始,新来的人要排在队尾等待。队列由以下3个函数实现:

  • Enqueue:向队尾添加数据。
  • Dequeue:从队首获取数据,并将其从队列中删除。
  • Size:队列长度,即返回数据结构中保存的数据个数。

编写支持这3种函数的队列,如下所示:

q <-c()
q size <- 0
enqueue <- function(data){q <<- c(q, data)q size <<- q_size + 1
} #入队
dequeue <- function(){first <- q[1]q <<- q[-1]q_size <<- q_size - 1return(first)
} #出队
size <- function(){return(q_size)
}

上述代码中,队列使用向量q保存其数据,q_size记录队列中保存的数据个数。
        函数cnqueue()中,将从参数接收到的数据与q中的原有数据拼接为新向量,然后赋给变量此时,要使用<-赋值运算符为全局变量q赋值,最后将q_size的值增加1。
        函数dequeue()中,首先将q中保存的第一个元素赋给first,然后将除第一个数据外的所有数据保存到q,最后返回first,并且要将q_size减1。
        函数size()返回q的长度,即q_size。
        但是上述函数,在其他地方直接操作对q进行赋值,而不通过相关函数,在调用size函数时,队列长度不会发生变化。因此,需要将队列全部代码与相关变量隐藏到1个函数。

queue <-function(){q<-c()q_size<- 0enqueue <- function(data){q <<- c(q, data)q_size <<- q_size + 1}dequeue <- function(){first <- q[1]q <<- q[-1]q_size <<- q_size -1return(first)}size <- function(){return(q_size)return(list(enqueue=enqueue, dequeue=dequeue, size=size))}
}

ps:文章用于学习

[参考书目] 徐珉久,R语言与数据分析实战,2017

【R语言与数据分析实战】R软件编程相关推荐

  1. 【R语言与数据分析实战】绘图

    目录 1.散点图 2.图像选项 2.1 坐标轴名称 2.2 图形标题 2.3 点的类型 2.4 点的大小 2.5 颜色 2.6 坐标轴的取值范围 2.7 图像类型 2.8 线型 2.9 图形排列 2. ...

  2. 看书标记【R语言 商务数据分析实战4】

    看书标记--关于R语言 chapter 4 4.2 任务实现 [R语言 商务数据分析实战4] chapter 4 财政收入预测分析 从海量数据中发现隐藏的运行模式,并提供具有决策意义的信息.变量过多会 ...

  3. 看书标记【R语言 商务数据分析实战5】

    看书标记--关于R语言 chapter 5 5.2 任务实现 [R语言 商务数据分析实战5] chapter 5 金融服务机构资金流量预测 数据理解和预处理>>检验平稳性+纯随机性> ...

  4. 看书标记【R语言 商务数据分析实战6】

    看书标记--关于R语言 chapter 6 6.2 任务实 [R语言 商务数据分析实战6] chapter 6 P2P信用贷款风险控制(用户逾期还款概率模型) 关于数据库的应用+数据清洗+实时数据识别 ...

  5. 看书标记【R语言 商务数据分析实战9】

    看书标记--关于R语言 chapter 9 9.2 任务实现 [R语言 商务数据分析实战9] chapter 9 餐饮企业综合分析 统计分析>>ARIMA预测销售额>>协同过滤 ...

  6. 【R语言与数据分析实战】数据操作(一):基于向量的处理与外部数据处理

    目录 1.R中的常用数据集 2.读写CSV文件 (1) 读写CSV文件 (2) 读写对象文件 3.合并数据框的行与列 4.apply系数函数 (1) apply (2) lapply (3) sapp ...

  7. R语言医学数据分析实战(三)数据可视化

    文章目录 一.用R的基础绘图系统作图 1.函数plot() 2.直方图和密度曲线图 3.条形图 4.饼图 5.箱线图和小提琴图 6.克里夫兰点图 二.用ggplot2包作图 1.初识ggplot2包 ...

  8. R语言与数据分析实战1-基础

    第1关:R语言的数据类型 本关是我们的第一关,任务非常简单,只要搞清楚我们面对的数据类型是什么,并能实现数据类型之间的转换,就可以过关啦! # 将 "3.14" 赋值给变量 pi, ...

  9. R语言与数据分析实战11-数据的删除

    第1关:数据的删除 在实际的数据分析任务中,我们所拿到的数据往往存在着各种瑕疵,比如大量的缺失值.野值.无效观测等,因此我们除了按照前序课程讲的那样提取出有用数据外,还可以将无效或者错误的数据直接进行 ...

最新文章

  1. Evernote用户只用了5%的功能,这着实给科技公司上了一课
  2. 照片处理和分享的思路
  3. boost::log::static_type_dispatcher用法的测试程序
  4. CRM one order性能调优指南
  5. ECMS系统服务器死机的处理,内存问题服务器死机一例
  6. 【抽奖】若川诚邀你加前端群,长期交流学习~
  7. wire 和 reg_Wire和Launchkit开源,水流监控系统以及更多新闻
  8. vs2019编译c语言提示有病毒,关于VS2019代码编译的问题(C++)
  9. 字符串解析成easyui-tree的格式
  10. 还在用 if else?试试策略模式吧!
  11. Ubuntu MySQL 授权语句错误 ERROR 1064 (42000)
  12. 安装.NET Framework 4失败解决办法
  13. mmdetection - config配置文件之schedule(learning rate)
  14. win7计算机搜索功能没有了,win7搜索功能不能用了怎么办|win7搜索功能不见了怎么解决? - 学无忧...
  15. mysql多字段分库分表基因码_mysql数据库优化方案之分库分表,轻松解决亿级数据问题...
  16. c语言学生信息结构体录入文件,C语言—学生信息管理系统
  17. 服务器无响应(已断开),服务器无响应 已断开(服务器无响应)
  18. Excel+VBA+之快速上手
  19. 图片路径加?什么意思
  20. Floodlight控制器的安装以及SDN环境的配置

热门文章

  1. IoT黑板报:树莓派Zero W发布 配有Wi-Fi和蓝牙售价10美元
  2. Linux 下进行服务器间网络测速
  3. ESRI中国(北京)招聘售前技术工程师(招聘结束,谢谢大家!)
  4. 蓝牙核心规范(V5.2)7.4-深入详解之AMP
  5. Proximal Distilled Evolutionary Reinforcement Learning
  6. [ LeetCode ] #17. Letter Combinations of a Phone Number(电话按键组合字符 C++ Python)
  7. 赵小楼《天道》《遥远的救世主》深度解析(73)你认为的玄幻不可描述的事物都是有其理法可循,认识了理法,玄也就不玄了
  8. phpstorm 插件
  9. 学习阶段C语言程序汇总
  10. 富文本编辑器三种不同图片上传功能