R语言apply()族函数概要,用来替代经典循环结构提高遍历效率


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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值