A. 处理循环
- R不仅有for/while循环语句,还有更强大的实现循环的"一句话"函数
B. 排序
C. 总结数据信息
1. lapply:可以循环处理列表中的每一个元素,总是返回一个列表
- lapply(列表,函数/函数名,其他参数)
- sapply:简化结果
a. 结果列表元素长度均为1,返回向量
b. 结果列表元素长度相同且大于1,返回矩阵
# lapply str(lapply) x <- list(a=1:10, b=c(11,21,31,41,51)) lapply(x, mean) # 计算每个列表的平均值 x <- 1:4 lapply(x, runif) # 从一个均匀分布的0到1里抽取若干个数出来 lapply(x, runif, min=0, max=100) # 从一个均匀分布的0到100里抽取若干个数出来 x <- list(a=matrix(1:6,2,3), b=matrix(4:7,2,2)) lapply(x, function(m) m[1,]) # 取出每个矩阵的第一行 # sapply x <- list(a=1:10, b=c(11,21,31,41,51)) lapply(x, mean) sapply(x, mean) # 返回结果从列表简化为向量
2. apply:沿着数组的某一维度处理数据
- 例如,将函数用于矩阵的行或列
- 虽然与for/while循环的效率相似,但是只用一句话就可以完成
- apply(数组,维度,函数/函数名)
# apply x <- matrix(1:16, 4, 4) apply(x, 2, mean) # 1维度为行,2维度为列 apply(x, 2, sum) apply(x, 1, sum) apply(x, 1, mean) rowSums(x) # 行和 rowMeans(x) # 行平均 colSums(x) # 列和 colMeans(x) # 列平均 x <- matrix(rnorm(100), 10, 10) # 从正态分布里随机抽取100个数据,组成一个10*10的矩阵 apply(x, 1, quantile, probs=c(0.25, 0.75)) # quantile求数据的百分位点 # probs表示求25%和75%对应百分位点的数据 x <- array(rnorm(2*3*4), c(2,3,4)) # 第一维度是2,第二维度是3,第三维度是4 apply(x,c(1,2),mean) # 在第一维和第二维组成的平面上,沿着第三维求平均 apply(x,c(1,3),mean) # 在第一维和第三维组成的平面上,沿着第二维求平均 apply(x,c(2,3),mean) # 在第二维和第三维组成的平面上,沿着第一维求平均
3. mapply:lapply的多元版本
- mapply(函数/函数名,数据,函数相关的参数)
# mapply list(rep(1,4),rep(2,3),rep(3,2),rep(4,1)) mapply(rep, 1:4, 4:1) # 函数名,数据,重复次数 s <- function(n, mean, std){ rnorm(n, mean, std) } # 从正态分布中要抽取的个数,随机分布的总体的均值,随机分布对应的标准差 s(4,0,1) # 抽取n个数据,均值为mean,标准差为std mapply(s, 1:5, 5:1, 2) list(s(1,5,2),s(2,4,2),s(3,3,2),s(4,2,2),s(5,1,2))
4. tapply:对向量的子集进行操作
- tapply(向量,因子/因子列表,函数/函数名)
# tapply x <- c(rnorm(5), runif(5), rnorm(5,1)) # 正态分布的5个值,均匀分布的5个值,mean为1且std为0的正态分布的5个值 f <- gl(3, 5) # 3个水平,每水平下5个元素 tapply(x, f, mean) # 对x向量,按照因子的水平进行分组,对每一组求均值 tapply(x, f, mean, simplify=FALSE)
5. split:根据因子或因子列表将向量或其他对象分组,通常与lapply一起使用
- split(向量/列表/数据框,因子/因子列表)
# split x <- c(rnorm(5), runif(5), rnorm(5,1)) f <- gl(3, 5) split(x, f) # 对x向量,按照因子的水平进行分组 lapply(split(x, f), mean) head(airquality) s <- split(airquality, airquality$Month) table(airquality$Month) lapply(s, function(x) colMeans(x[,c("Ozone","Wind","Temp")],na.rm=TRUE)) sapply(s, function(x) colMeans(x[,c("Ozone","Wind","Temp")])) sapply(s, function(x) colMeans(x[,c("Ozone","Wind","Temp")],na.rm=TRUE))
6. 排序:
- sort:对向量进行排序;返回排好序的内容
- order:返回排好序的内容的下标 / 多个排序标准
# sort and order x <- data.frame(v1=1:5, v2=c(10,7,9,6,8), v3=11:15, v4=c(1,1,2,2,1)) sort(x$v2) sort(x$v2, decreasing=TRUE) order(x$v2) x[order(x$v2),] x[order(x$v4,x$v2),] x[order(x$v4,x$v2,decreasing=TRUE),]
7. 总结数据信息
# summarize data head(airquality) tail(airquality, 2) summary(airquality) str(airquality) table(airquality$Month) table(airquality$Ozone) table(airquality$Ozone, useNA="ifany") table(airquality$Month, airquality$Day) any(is.na(airquality$Ozone)) sum(is.na(airquality$Ozone)) all(airquality$Month<12) titanic <- as.data.frame(Titanic) head(titanic) dim(titanic) summary(titanic) x <- xtabs(Freq ~ Class + Age, data=titanic) ftable(x) object.size(airquality) print(object.size(airquality), units='Kb')
8. 小结