R语言有很重要的apply族函数:lapply sapply apply tapply mapply。这些函数底层通过C实现,效率比手工遍历高效。apply族函数是高效能计算的运算向量化(Vectorization)实现方法之一,比起传统的for,while常常能获得更好的性能。
1. apply 对matrix指定维度操作
###1. apply 对matrix指定维度操作
x <- cbind(x1 = 3, x2 = c(4:1, 2:5),x3= c(1:8))
dimnames(x)[[1]] <- letters[1:8]
apply(x, 2, mean, trim = .2) # 列求平均值
col.sums <- apply(x, 2, sum)
row.sums <- apply(x, 1, sum)
row.sums <- apply(x, 1, sum,simplify = TRUE)
2. lapply:对列表的每个组件执行给定的函数,并返回另一个列表。
###2. lapply:对列表的每个组件执行给定的函数,并返回另一个列表。
x <- list(a = 1:10, beta = exp(-3:3), logic = c(TRUE,FALSE,FALSE,TRUE))
lapply(x,quantile) # 返回list
lapply(x, mean)
lapply(x, quantile, probs = 1:3/4)
3. sapply: 简化的apply和lapply,结果以向量,矩阵,列表的形式输出
###3. sapply: 简化的apply和lapply,结果以向量,矩阵,列表的形式输出
sapply(x, quantile) # 返回matrix
y<-c("100-D","100-A","110-c","110-A")
z<-strsplit(y,"-")
sapply(z,"[",1) #提取列表第1个元素
sapply(z,"[",2) #提取列表中第2个元素
4. mapply:将函数应用于多个列表或向量参数,多参数版本的sapply
###4. mapply:将函数应用于多个列表或向量参数,多参数版本的sapply
b<-matrix(1:12,c(3,4),dimnames=list(c("a","b","c"),c("A","B","C","D")))
mapply(sum, b[,1],b[,3],b[,4]) # 对多个向量按index分别求和
5. vapply:与sapply相似,可以预先指定的返回值类型,得到的结果更加安全
###5. vapply:与sapply相似,可以预先指定的返回值类型,得到的结果更加安全。
vapply(x, quantile, c(1,2,3,6,8))
6. tapply:将数据按照不同方式分组,生成类似列联表形式的数据结果
### 6. tapply:将数据按照不同方式分组,生成类似列联表形式的数据结果。
manager <- c(1, 2, 3, 4, 5)
country <- c("US", "US", "UK", "UK", "UK")
gender <- c("M", "F", "F", "M", "F")
age <- c(32, 45, 25, 39, 99)
leadership <- data.frame(manager, country, gender, age)
#不同country水平下的age的均值
tapply(leadership$age, leadership$country, mean)
#不同country和gender交叉水平下的age的均值, 输出得到矩阵数据
tapply(leadership$age, list(leadership$country, leadership$gender), mean)