apply()
族函数的作用主要是替代经典循环结构,这些函数底层通过C实现向量化运算,执行效率比经典遍历(for与while)更高效。它们可用于输入列表,数据框,向量,矩阵或数组并应用函数。任何函数都可以传递到apply()
循环体中。
- apply : 用于遍历数组中的行或列,并且使用指定函数来对其元素进行处理;
- lapply : 遍历列表向量内的每个元素,并且使用指定函数来对其元素进行处理。返回列表向量;
- tapply: 接入参数INDEX,对数据分组进行运算,实现dplyr中的group_by处理;
- sapply : 与lapply基本相同,只是对返回结果进行了简化,返回的是普通的向量;
- mapply: 支持传入两个以上的列表。
功能演示
#建立一个数据框
>df
gene.1 gene.2 gene.3
A 2 4 3
B 6 4 3
C 1 2 3
D 8 9 3
1、apply
> apply(df,1,function(x) sum(x)+2) #对列求和+2
A B C D
11 15 8 22
使用apply
调用自定义的函数 f
取代经典循环结构对行数据进行处理,需要注意循环结构内的数据格式;
apply遍历 行/列 传入的数据,数据格式在apply循环体内会变成 "character" 类型,所以在应用自定义函数的时候需要注意数据格式转换。
> df[1:10,]
rowname value norm
1 AAA_1 0.89122424 11.165354
2 AAA_2 0.19505444 10.345972
3 AAA_3 0.14226178 8.908890
FUNC <- function(row,option){
print(row)
print(class(row))
print(data.frame(row))
cat(paste0(">>>>>>>>>>>>>>>>>>Hellow ",option,"\n"))
Sys.sleep(5)
}
> apply(df, 1, FUN = function(x) FUNC(x,option="World")) #传递双参数
rowname value norm
"AAA_1" " 0.1085221972" " 8.221924"
[1] "character"
row
rowname AAA_1
value 0.1085221972
norm 8.221924
>>>>>>>>>>>>>>>>>>Hellow World
...
2、lapply
li <- list(c(1,2,3))
> lapply(li, function(x) x+3)
[[1]]
[1] 4 5 6
通过lapply
获取指定文件名的文件路径
file.name = c(" file_1.txt","file_2.txt","file_3.txt")
file.paths <- lapply( unique(file.name), function(x) dir(path = ".",pattern = x ,full.names = T) )
file.paths <- file.paths[lengths(file.paths)!=0]
lapply
调用自定义函数,传入多参数
file.name = c(" file_1.txt","file_2.txt","file_3.txt")
postfix = ".bak"
f <- function(x,postfix){
retu = paste0(x,prefix)
retu
}
> lapply( file.names,function(x) f(x,prefix = prefix) )
[[1]]
[1] "file_1.txt.bak"
[[2]]
[1] "file_2.txt.bak"
[[3]]
[1] "file_3.txt.bak"
3、tapply
cellN <- c("cell.1",'cell.1','cell.1','cell.2')
sample <-c('l1','l1','l2','l2')
value <- c(2,2,2,2)
> tapply(X = value,INDEX = list(cellN,sample),FUN = sum)
l1 l2
cell.1 4 2
cell.2 NA 2
4、sapply
> sapply(df,function(x) x^2,simplify = T)
gene.1 gene.2 gene.3
[1,] 4 16 9
[2,] 36 16 9
[3,] 1 4 9
[4,] 64 81 9
5、mapply
a <- c(1,2,3)
b <- c(1,1,1)
> mapply(function(x,y) x+y, a , b)
[1] 2 3 4
网友评论