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

简介: 在R语言中,apply函数族是一组非常有用的函数,包括apply、lapply、sapply、tapply、mapply等。这些函数都可以对矩阵、数组、列表等数据结构进行操作,本文示例了它们基本用法以供参考学习

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
目录
相关文章
|
4月前
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
79 3
|
6月前
|
数据可视化 数据挖掘 数据处理
R语言函数与自定义函数:提高代码的复用性
【8月更文挑战第27天】 自定义函数是R语言编程中不可或缺的一部分,它们通过封装复杂的逻辑和提供灵活的参数化设计,极大地提高了代码的复用性和可维护性。通过掌握自定义函数的基本语法和高级技巧,我们可以编写出更加高效、可读的R语言代码,从而更好地应对复杂的数据分析和统计建模任务。
|
8月前
|
Python
R语言遍历文件夹求取其中所有栅格文件的平均值
通过NAvalue(tif_file_all) <- -10000这句代码,将值为-10000的像元作为NoData值的像元,防止后期计算平均值时对结果加以干扰。   接下来,我们通过file.path()函数配置一下输出结果的路径——其中,结果遥感影像文件的名称就可以直接以其所对应的条带号来设置,并在条带号后添加一个_mean后缀,表明这个是平均值的结果图像;但此外,这个仅仅是文件的名字,还需要将文件名与路径拼接在一起,才可以成为完整的保存路径,因此需要用到file.path()函数。最后,将结果图像通过writeRaster()函数加以保存即可,这句代码的解释大家同样参考R语言求取大量遥感
199 0
|
9月前
|
图形学
R语言其他相关函数(各函数解析含实例,可供查询)
R语言其他相关函数(各函数解析含实例,可供查询)
232 0
|
9月前
R语言绘图相关函数(含实例)
R语言绘图相关函数(含实例)
90 0
|
9月前
|
数据可视化
R语言用非凸惩罚函数回归(SCAD、MCP)分析前列腺数据
R语言用非凸惩罚函数回归(SCAD、MCP)分析前列腺数据
|
9月前
|
数据可视化
R语言可视化渐近正态性、收敛性:大数定律、中心极限定理、经验累积分布函数
R语言可视化渐近正态性、收敛性:大数定律、中心极限定理、经验累积分布函数
|
9月前
|
算法 Windows
R语言广义二次跳跃、非线性跳跃扩散过程转移函数密度的估计及其应用
R语言广义二次跳跃、非线性跳跃扩散过程转移函数密度的估计及其应用
|
9月前
|
数据可视化
R语言广义相加(加性)模型(GAMs)与光滑函数可视化
R语言广义相加(加性)模型(GAMs)与光滑函数可视化
|
9月前
|
机器学习/深度学习 算法 数据可视化
R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类
R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类