【R语言与数据分析实战】R软件编程
目录
- 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软件编程相关推荐
- 【R语言与数据分析实战】绘图
目录 1.散点图 2.图像选项 2.1 坐标轴名称 2.2 图形标题 2.3 点的类型 2.4 点的大小 2.5 颜色 2.6 坐标轴的取值范围 2.7 图像类型 2.8 线型 2.9 图形排列 2. ...
- 看书标记【R语言 商务数据分析实战4】
看书标记--关于R语言 chapter 4 4.2 任务实现 [R语言 商务数据分析实战4] chapter 4 财政收入预测分析 从海量数据中发现隐藏的运行模式,并提供具有决策意义的信息.变量过多会 ...
- 看书标记【R语言 商务数据分析实战5】
看书标记--关于R语言 chapter 5 5.2 任务实现 [R语言 商务数据分析实战5] chapter 5 金融服务机构资金流量预测 数据理解和预处理>>检验平稳性+纯随机性> ...
- 看书标记【R语言 商务数据分析实战6】
看书标记--关于R语言 chapter 6 6.2 任务实 [R语言 商务数据分析实战6] chapter 6 P2P信用贷款风险控制(用户逾期还款概率模型) 关于数据库的应用+数据清洗+实时数据识别 ...
- 看书标记【R语言 商务数据分析实战9】
看书标记--关于R语言 chapter 9 9.2 任务实现 [R语言 商务数据分析实战9] chapter 9 餐饮企业综合分析 统计分析>>ARIMA预测销售额>>协同过滤 ...
- 【R语言与数据分析实战】数据操作(一):基于向量的处理与外部数据处理
目录 1.R中的常用数据集 2.读写CSV文件 (1) 读写CSV文件 (2) 读写对象文件 3.合并数据框的行与列 4.apply系数函数 (1) apply (2) lapply (3) sapp ...
- R语言医学数据分析实战(三)数据可视化
文章目录 一.用R的基础绘图系统作图 1.函数plot() 2.直方图和密度曲线图 3.条形图 4.饼图 5.箱线图和小提琴图 6.克里夫兰点图 二.用ggplot2包作图 1.初识ggplot2包 ...
- R语言与数据分析实战1-基础
第1关:R语言的数据类型 本关是我们的第一关,任务非常简单,只要搞清楚我们面对的数据类型是什么,并能实现数据类型之间的转换,就可以过关啦! # 将 "3.14" 赋值给变量 pi, ...
- R语言与数据分析实战11-数据的删除
第1关:数据的删除 在实际的数据分析任务中,我们所拿到的数据往往存在着各种瑕疵,比如大量的缺失值.野值.无效观测等,因此我们除了按照前序课程讲的那样提取出有用数据外,还可以将无效或者错误的数据直接进行 ...
最新文章
- Evernote用户只用了5%的功能,这着实给科技公司上了一课
- 照片处理和分享的思路
- boost::log::static_type_dispatcher用法的测试程序
- CRM one order性能调优指南
- ECMS系统服务器死机的处理,内存问题服务器死机一例
- 【抽奖】若川诚邀你加前端群,长期交流学习~
- wire 和 reg_Wire和Launchkit开源,水流监控系统以及更多新闻
- vs2019编译c语言提示有病毒,关于VS2019代码编译的问题(C++)
- 字符串解析成easyui-tree的格式
- 还在用 if else?试试策略模式吧!
- Ubuntu MySQL 授权语句错误 ERROR 1064 (42000)
- 安装.NET Framework 4失败解决办法
- mmdetection - config配置文件之schedule(learning rate)
- win7计算机搜索功能没有了,win7搜索功能不能用了怎么办|win7搜索功能不见了怎么解决? - 学无忧...
- mysql多字段分库分表基因码_mysql数据库优化方案之分库分表,轻松解决亿级数据问题...
- c语言学生信息结构体录入文件,C语言—学生信息管理系统
- 服务器无响应(已断开),服务器无响应 已断开(服务器无响应)
- Excel+VBA+之快速上手
- 图片路径加?什么意思
- Floodlight控制器的安装以及SDN环境的配置
热门文章
- IoT黑板报:树莓派Zero W发布 配有Wi-Fi和蓝牙售价10美元
- Linux 下进行服务器间网络测速
- ESRI中国(北京)招聘售前技术工程师(招聘结束,谢谢大家!)
- 蓝牙核心规范(V5.2)7.4-深入详解之AMP
- Proximal Distilled Evolutionary Reinforcement Learning
- [ LeetCode ] #17. Letter Combinations of a Phone Number(电话按键组合字符 C++ Python)
- 赵小楼《天道》《遥远的救世主》深度解析(73)你认为的玄幻不可描述的事物都是有其理法可循,认识了理法,玄也就不玄了
- phpstorm 插件
- 学习阶段C语言程序汇总
- 富文本编辑器三种不同图片上传功能