R语言02
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
也可以用sapply()函数简化,sapply(x,f)指对x的每一个元素使用函数f(), 并将结果转化为矩阵。例:
z12 <- function(z) return(c(z,z^2)) sapply(1:8,z12)
2.7 NA与NULL值
NA:缺失值,存在但未知 NULL:不存在的值
2.7.1 NA的使用
2.1 标量、向量、数组与矩阵
2.1.1 添加或删除向量元素
R中向量元素是连续存储的,因此不能插入或删除元素。在R中, 向量的大小在创建时已经确定,因此如果想要添加或者删除元素,需 要重新给向量赋值。例如,把一个元素添加到一个四元向量的中间的 代码如下: x <- c(88,5,12,12) x <- c(x[1:3],168,x[4])
2.4.4 使用SEQ()创建向量
seq():生成等差序列。如: seq(from =12,to =30,by =3) seq(from = 1.1, to = 2, length = 10)
使用seq()生成向量索引序列: x <- c(5,12,13) seq(x) x <- NULL seq(x)
2.4 常用的向量运算
2.4.1 向量运算和逻辑运算
R是一种函数式语言,每一个运算符实际上也是函数。如: 2+3 “+”(2,3)
*,/, %%等函数在R中是对应元素之间分别运算。如: x <- c(1,2,4) x / c(5,4,-1) x %% c(5,4,-1)
2.4.2 向量索引
索引格式:向量1[向量2] y <- c(1.2,3.9,0.4,0.12) y[c(1,3)] # 访问y中第1,3个元素 y[2:3] v <- 3:4; y[v]
2.11 向量元素的名称
可以用names()函数给向量中的元素命名或查询其名称。例: x <- c(1,2,4) names(x) names(x) <- c(“a”,”b”,”ab”) names(x)
超越函数(平方根、对数、三角函数等),R中许多内置函数。例: sqrt(1:9) y <- c(1.2,3.9,0.4) z <- round(y) # 求与每个元素距离最近的整数值 y +4 ‘+’(y,4)
2.6.1 向量输入,向量输出 (CONT’D)
例:看上去有标量的向量化函数 f <- function(x,c) return((x+c)^2) f(1:3,0) f(1:3,1) f(1:3,1:3) 注意:会带来代码安全性问题。
跳过缺失值NA:使用na.rm设置 x <- c(88,NA,12,168,13) mean(x) mean(x,na.rm = T) x <- c(88,NULL,12,168,13) mean(x)
NA值的模式可有多种: x <- c(5,NA,12) mode(x[1]) mode(x[2]) y <-c(“abc”,”def”,NA) mode(y[3])
注意:NULL是R中的特殊现象,它没有模式
2.8 筛选
2.8.1 生成筛选索引
通过筛选提取向量中满足一定条件 的元素。 例1: z <- c(5,2,-3,8) w <- z[ z*z > 8 ] #提取z中平方大 于8的数 w
例2: z <- c(5,2,-3,8) j <- z*z > 8 j y <- c(1,2,30,5) y[j]
2.2 声明问题
R中变量定义时无需提前声明。但若要引用向量中的特定元素,就必须事先告知R。 例如,希望y是一个二元向量,由5和12组成,下面语句无法工作: y[1] <- 5 y[2] <- 12 必须先创建y,如: y <- vector(length=2) y[1] <- 5 y[2] <- 12 或者: y <- c(5,12)
2.5 使用ALL()和ANY()
any():判断参数是否有一个为TRUE all():判断参数是否全部为TRUE 如:
x <- 1:10 any(x > 8) any(x > 88) all(x>88) all(x > 0)
2.5.1 案例:寻找连续出现1的游程 (随机游程检验)
假设一个向量由若干0和1组成,我们想找出其中连续出现1的游程。用函数findruns()来实现 这一功能: findruns <- function(x,k) {
2.4.3 用运算符创建向量
冒号运算符“:”:生成指定范围内数值构成的向量 5:8 5:1
使用时需注意运算符优先级: i <- 2 1 : i-1 # 1至i然后-1,并非1至(i-1) 1 : (i-1) 冒号优先级高于减号,括号优先级高于冒号
注意:在命令窗口中输入?Syntax可以从R自带的帮助文件中获得运算符 优先级的详细说明。
第二章 向量(创建、索引、基本操作、 相关函数、特性)
2.1 标量、向量、数组与矩阵 2.2 声明 2.3 循环补齐 2.4 常用向量运算 2.5 使用all()和any() 2.6 向量化运算符 2.7 NA与NULL值 2.8 筛选 2.9 向量化的ifelse()函数 2.10 测试向量相等 2.11 向量元素的名称 2.12 关于c()的更多内容
} return(i) } 或: first1a <- function(x) return(which(x == 1)[1])
2.9 向量化的IFELSE()函数
ifelse()是向量化版本的if-then-else结构:ifelse(b,u,v),其中b为一个布尔值 向量,u和v为向量。 函数返回值为向量,如b[i]为真,则第i个返回元素为u[i], 反之为v[i]。 例1:
可以用判断语句限制c为标量 f <- function(x,c) { if (length(c) != 1) stop(“vector c not allowed”) return((x+c)^2) }
2.6.2 向量输入,矩阵输出
函数本身的返回值就是向量: z12 <- function(z) return(c(z,z^2)) x <- 1:8 z12(x) matrix(z12(x),ncol =2)
例3: x <- c(1,3,8,2,20) x[x>3] <- 0 #将x中大于3的元素替换为0 x
2.8.2 使用SUBSET()函数筛选
subset(பைடு நூலகம்函数处理NA值与普通方法不同,subset()会自动剔除NA值。
例: x <- c(6, 1:3, NA, 12) x x[x>5] subset(x, x>5)
2.1.2 获取长度
获取向量长度: length(x)
判断向量参数中第一个1所在的位置: first1 <- function(x){ for (i in 1 : length(x)) { if (x[i] == 1) break #跳出循环 } return(i) }
如不用length()函数则需引入新变量n用于指定x的元素: for (n in x) 但是此时无法获得所需元素的索引
n <-length(x) runs <- NULL for (i in 1:(n-k+1)) {
if (all(x[i:(i+k-1)] == 1)) runs <- c(runs,i)} return(runs)} y <-c(1,0,0,1,1,1,0,1,1) findruns(y,3) findruns(y,2) findruns(y,6) 缺点:每次循环中都要给新向量c(runs,i)分配内存空间,减慢代码的运行速度
vud <- v[-1] - v[-length(v)] return(ifelse(vud>0,1,0)) } udcorr <- function(x,y) { ud <- lapply(list(x,y),findud) #将x,y放入同一个列表用lapply调用findud return(mean(ud[[1]] ==ud[[2]])) } x <- c(5,12,13,3,6,0,1,15,16,8,88) y <- c(4,2,3,23,6,10,11,12,6,3,2) udcorr(x,y)
x <- 1:10 y <- ifelse( x%%2 == 0, 5, 12) #偶数返回5,奇数返回12 y 例2: x <- c(5,2,9,12) ifelse(x>6,2*x,3*x)
2.9.1 扩展案例:度量相关性
对于两组向量x和y,通过比较同时上升或下降次数占总观测数的比例来衡量两者的相关 性。 findud <- function(v){ #用1,0序列表示一个向量升降次序,1为升,0为降
2.7.2 NULL的使用
使用NULL创建空变量: z <- NULL for (i in 1 :10) if(i %% 2 ==0) z <- c(z,i)
NA与NULL的区别: z <- NA for (i in 1 :10) if(i %% 2 ==0) z <- c(z,i) u <- NULL length(u) v <- NA length(v)
2.10 测试向量相等
测试两个向量是否相等,不可直接用==符号。如: x <- 1:3 y <- c(1,3,4) x == y
应用all()函数: all(x == y)
或者: identical(x,y)
需注意identical是判断两者是否完全一样,如: x <- 1:2 y <- c(1,2) identical(x,y) typeof(x) typeof(y)
另一问题:length(x) 可能为0。如: x <- c() length(x)
2.1.3 作为向量的矩阵和数组
数组、矩阵:本质上为向量添加了额外的类属性,例如矩阵的行 数和列数。例:
m <- matrix(c(1,3,2,4), nrow = 2, ncol = 2) m + 10 :13 # 矩阵与向量之间可直接做加法运算
2.6 向量化运算符
假设我们希望对向量x中的每一个元素使用函数f()。在很多情况下,我们 可以简单的调用f()就能完成。这可以简化我们的代码,提高运行效率。
2.6.1 向量输入,向量输出
向量化运算符号:+,*, >。例: u <- c(5,2,8) v <- c(1,3,9) u >v
如果一个函数使用了向量化运算符,那么它也被向量化。例 w <- function(x) return(x+1) w(u)
注意:元素重复是允许的。如 x <- c(4,2,17,5); y <-
x[c(1,1,3)]
负数代表剔除相应元素: z <- c(5,12,13) z[-1] #剔除第一个元素 z[-1:-2] #剔除第1到2个元素
选择向量z中除最后一个元素外的其他 元素:
z <- c(5,12,13); z[1:length(z)-1] 或 z[-length(z)]
2.4.5 使用REP()重复向量常数
rep(x,times):创建times*length(x)个元素的向量,由x重复times次构成。 如:
x <- rep(8,4) rep(c(5,12,13),3) rep(1:3,2) 参数each:x交替重复次数 rep(c(5,12,13), each =2)
2.8.3 选择函数WHICH()
which()返回满足相应条件元素所在的位置。 例1: z <- c(5,2,-3,8) which(z*z >8) 例2:找到一个向量中满足一定条件的元素首次出现的位置。 first1 <- function(x){ #找到第一个1
for (i in 1:length(x)) { if (x[i] == 1) break
2.3 循环补齐
在对两个向量使用运算符时,如要求具有相同长度,R会自动循环补齐, 即重复较短的向量,直到两者长度相同。如:
c(1,2,4) + c(6,0,9,20,22) 其实际运算执行如下: c(1,2,4,1,2) + c(6,0,9,20,22) 另一例子: x <- matrix(c(1,2,3,4,5,6),3,2) x + c(1,2) 其实际执行如下: x + c(1,2,1,2,1,2)
z12 <- function(z) return(c(z,z^2)) sapply(1:8,z12)
2.7 NA与NULL值
NA:缺失值,存在但未知 NULL:不存在的值
2.7.1 NA的使用
2.1 标量、向量、数组与矩阵
2.1.1 添加或删除向量元素
R中向量元素是连续存储的,因此不能插入或删除元素。在R中, 向量的大小在创建时已经确定,因此如果想要添加或者删除元素,需 要重新给向量赋值。例如,把一个元素添加到一个四元向量的中间的 代码如下: x <- c(88,5,12,12) x <- c(x[1:3],168,x[4])
2.4.4 使用SEQ()创建向量
seq():生成等差序列。如: seq(from =12,to =30,by =3) seq(from = 1.1, to = 2, length = 10)
使用seq()生成向量索引序列: x <- c(5,12,13) seq(x) x <- NULL seq(x)
2.4 常用的向量运算
2.4.1 向量运算和逻辑运算
R是一种函数式语言,每一个运算符实际上也是函数。如: 2+3 “+”(2,3)
*,/, %%等函数在R中是对应元素之间分别运算。如: x <- c(1,2,4) x / c(5,4,-1) x %% c(5,4,-1)
2.4.2 向量索引
索引格式:向量1[向量2] y <- c(1.2,3.9,0.4,0.12) y[c(1,3)] # 访问y中第1,3个元素 y[2:3] v <- 3:4; y[v]
2.11 向量元素的名称
可以用names()函数给向量中的元素命名或查询其名称。例: x <- c(1,2,4) names(x) names(x) <- c(“a”,”b”,”ab”) names(x)
超越函数(平方根、对数、三角函数等),R中许多内置函数。例: sqrt(1:9) y <- c(1.2,3.9,0.4) z <- round(y) # 求与每个元素距离最近的整数值 y +4 ‘+’(y,4)
2.6.1 向量输入,向量输出 (CONT’D)
例:看上去有标量的向量化函数 f <- function(x,c) return((x+c)^2) f(1:3,0) f(1:3,1) f(1:3,1:3) 注意:会带来代码安全性问题。
跳过缺失值NA:使用na.rm设置 x <- c(88,NA,12,168,13) mean(x) mean(x,na.rm = T) x <- c(88,NULL,12,168,13) mean(x)
NA值的模式可有多种: x <- c(5,NA,12) mode(x[1]) mode(x[2]) y <-c(“abc”,”def”,NA) mode(y[3])
注意:NULL是R中的特殊现象,它没有模式
2.8 筛选
2.8.1 生成筛选索引
通过筛选提取向量中满足一定条件 的元素。 例1: z <- c(5,2,-3,8) w <- z[ z*z > 8 ] #提取z中平方大 于8的数 w
例2: z <- c(5,2,-3,8) j <- z*z > 8 j y <- c(1,2,30,5) y[j]
2.2 声明问题
R中变量定义时无需提前声明。但若要引用向量中的特定元素,就必须事先告知R。 例如,希望y是一个二元向量,由5和12组成,下面语句无法工作: y[1] <- 5 y[2] <- 12 必须先创建y,如: y <- vector(length=2) y[1] <- 5 y[2] <- 12 或者: y <- c(5,12)
2.5 使用ALL()和ANY()
any():判断参数是否有一个为TRUE all():判断参数是否全部为TRUE 如:
x <- 1:10 any(x > 8) any(x > 88) all(x>88) all(x > 0)
2.5.1 案例:寻找连续出现1的游程 (随机游程检验)
假设一个向量由若干0和1组成,我们想找出其中连续出现1的游程。用函数findruns()来实现 这一功能: findruns <- function(x,k) {
2.4.3 用运算符创建向量
冒号运算符“:”:生成指定范围内数值构成的向量 5:8 5:1
使用时需注意运算符优先级: i <- 2 1 : i-1 # 1至i然后-1,并非1至(i-1) 1 : (i-1) 冒号优先级高于减号,括号优先级高于冒号
注意:在命令窗口中输入?Syntax可以从R自带的帮助文件中获得运算符 优先级的详细说明。
第二章 向量(创建、索引、基本操作、 相关函数、特性)
2.1 标量、向量、数组与矩阵 2.2 声明 2.3 循环补齐 2.4 常用向量运算 2.5 使用all()和any() 2.6 向量化运算符 2.7 NA与NULL值 2.8 筛选 2.9 向量化的ifelse()函数 2.10 测试向量相等 2.11 向量元素的名称 2.12 关于c()的更多内容
} return(i) } 或: first1a <- function(x) return(which(x == 1)[1])
2.9 向量化的IFELSE()函数
ifelse()是向量化版本的if-then-else结构:ifelse(b,u,v),其中b为一个布尔值 向量,u和v为向量。 函数返回值为向量,如b[i]为真,则第i个返回元素为u[i], 反之为v[i]。 例1:
可以用判断语句限制c为标量 f <- function(x,c) { if (length(c) != 1) stop(“vector c not allowed”) return((x+c)^2) }
2.6.2 向量输入,矩阵输出
函数本身的返回值就是向量: z12 <- function(z) return(c(z,z^2)) x <- 1:8 z12(x) matrix(z12(x),ncol =2)
例3: x <- c(1,3,8,2,20) x[x>3] <- 0 #将x中大于3的元素替换为0 x
2.8.2 使用SUBSET()函数筛选
subset(பைடு நூலகம்函数处理NA值与普通方法不同,subset()会自动剔除NA值。
例: x <- c(6, 1:3, NA, 12) x x[x>5] subset(x, x>5)
2.1.2 获取长度
获取向量长度: length(x)
判断向量参数中第一个1所在的位置: first1 <- function(x){ for (i in 1 : length(x)) { if (x[i] == 1) break #跳出循环 } return(i) }
如不用length()函数则需引入新变量n用于指定x的元素: for (n in x) 但是此时无法获得所需元素的索引
n <-length(x) runs <- NULL for (i in 1:(n-k+1)) {
if (all(x[i:(i+k-1)] == 1)) runs <- c(runs,i)} return(runs)} y <-c(1,0,0,1,1,1,0,1,1) findruns(y,3) findruns(y,2) findruns(y,6) 缺点:每次循环中都要给新向量c(runs,i)分配内存空间,减慢代码的运行速度
vud <- v[-1] - v[-length(v)] return(ifelse(vud>0,1,0)) } udcorr <- function(x,y) { ud <- lapply(list(x,y),findud) #将x,y放入同一个列表用lapply调用findud return(mean(ud[[1]] ==ud[[2]])) } x <- c(5,12,13,3,6,0,1,15,16,8,88) y <- c(4,2,3,23,6,10,11,12,6,3,2) udcorr(x,y)
x <- 1:10 y <- ifelse( x%%2 == 0, 5, 12) #偶数返回5,奇数返回12 y 例2: x <- c(5,2,9,12) ifelse(x>6,2*x,3*x)
2.9.1 扩展案例:度量相关性
对于两组向量x和y,通过比较同时上升或下降次数占总观测数的比例来衡量两者的相关 性。 findud <- function(v){ #用1,0序列表示一个向量升降次序,1为升,0为降
2.7.2 NULL的使用
使用NULL创建空变量: z <- NULL for (i in 1 :10) if(i %% 2 ==0) z <- c(z,i)
NA与NULL的区别: z <- NA for (i in 1 :10) if(i %% 2 ==0) z <- c(z,i) u <- NULL length(u) v <- NA length(v)
2.10 测试向量相等
测试两个向量是否相等,不可直接用==符号。如: x <- 1:3 y <- c(1,3,4) x == y
应用all()函数: all(x == y)
或者: identical(x,y)
需注意identical是判断两者是否完全一样,如: x <- 1:2 y <- c(1,2) identical(x,y) typeof(x) typeof(y)
另一问题:length(x) 可能为0。如: x <- c() length(x)
2.1.3 作为向量的矩阵和数组
数组、矩阵:本质上为向量添加了额外的类属性,例如矩阵的行 数和列数。例:
m <- matrix(c(1,3,2,4), nrow = 2, ncol = 2) m + 10 :13 # 矩阵与向量之间可直接做加法运算
2.6 向量化运算符
假设我们希望对向量x中的每一个元素使用函数f()。在很多情况下,我们 可以简单的调用f()就能完成。这可以简化我们的代码,提高运行效率。
2.6.1 向量输入,向量输出
向量化运算符号:+,*, >。例: u <- c(5,2,8) v <- c(1,3,9) u >v
如果一个函数使用了向量化运算符,那么它也被向量化。例 w <- function(x) return(x+1) w(u)
注意:元素重复是允许的。如 x <- c(4,2,17,5); y <-
x[c(1,1,3)]
负数代表剔除相应元素: z <- c(5,12,13) z[-1] #剔除第一个元素 z[-1:-2] #剔除第1到2个元素
选择向量z中除最后一个元素外的其他 元素:
z <- c(5,12,13); z[1:length(z)-1] 或 z[-length(z)]
2.4.5 使用REP()重复向量常数
rep(x,times):创建times*length(x)个元素的向量,由x重复times次构成。 如:
x <- rep(8,4) rep(c(5,12,13),3) rep(1:3,2) 参数each:x交替重复次数 rep(c(5,12,13), each =2)
2.8.3 选择函数WHICH()
which()返回满足相应条件元素所在的位置。 例1: z <- c(5,2,-3,8) which(z*z >8) 例2:找到一个向量中满足一定条件的元素首次出现的位置。 first1 <- function(x){ #找到第一个1
for (i in 1:length(x)) { if (x[i] == 1) break
2.3 循环补齐
在对两个向量使用运算符时,如要求具有相同长度,R会自动循环补齐, 即重复较短的向量,直到两者长度相同。如:
c(1,2,4) + c(6,0,9,20,22) 其实际运算执行如下: c(1,2,4,1,2) + c(6,0,9,20,22) 另一例子: x <- matrix(c(1,2,3,4,5,6),3,2) x + c(1,2) 其实际执行如下: x + c(1,2,1,2,1,2)