apply 的简单用法指南
R中的apply族函数是一组R向量化函数,允许通过数组执行复杂的任务,避免使用for循环。
R中的apply() 功能
apply可用于数组、矩阵或数据框。
apply(X, # 数组、矩阵或数据框 MARGIN, # 1: 按行, 2: 按列, c(1, 2): 同时按行和列 FUN, # 函数 ...) # FUN的附加参数
生成示例数据
# Data frame df <- data.frame(x = 1:4, y = 5:8, z = 10:13) df
> df x y z 1 1 5 10 2 2 6 11 3 3 7 12 4 4 8 13
对每行应用函数
apply(X = df, MARGIN = 1, FUN = sum) #对每行求和
[1] 16 19 22 25
可以不指定参数名,但应注意参数的顺序。
apply(df, 1, sum)
还可以应用于特定的索引或单元格,将数据集中的数据子集化。
apply(df[c(1, 2), ], 1, sum)
1 2 16 19
注意,输出是一个包含每一行对应和的向量。
对每列应用函数
apply(df, 2, sum) #对每列求和
x y z 10 26 46
同样,也可以对特定列应用函数。
apply(df[, c(1, 3)], 2, sum)
x z 10 46
注:前面的示例仅作教学。使用colSums和rowSums函数分别计算列和行的和更有效。
对整个数据框应用函数
apply(df, c(1, 2), sum) #对每个值求和
x y z [1, ] 1 5 10 [2, ] 2 6 11 [3, ] 3 7 12 [4, ] 4 8 13
apply(df, c(2, 1), sum) #调换1,2位置相当于转置了矩阵。
[,1] [,2] [,3] [,4] x 1 2 3 4 y 5 6 7 8 z 10 11 12 13
注:输出的为 matrix 而不是 data.frame.
在本例中,输出的元素是数据集本身的元素,因为计算的是每个单独单元格的和。
函数的附加参数
mean函数有一个额外的参数(na.rm)来指定是否删除NA值。如果需要指定所应用的函数的参数,可以用逗号分隔:
apply(df, 1, mean, na.rm = TRUE)
应用自定义函数
本例中,我们将创建一个名为fun的函数,它计算一个数字的平方,如果character参数设置为TRUE,则将输出转换为字符。
fun <- function(x, character = FALSE) { if (character == FALSE) { x ^ 2 } else { as.character(x ^2) } }
如果按行应用该函数,输出将是一个包含按行平方的元素的矩阵。
apply(df, 1, fun)
[, 1] [, 2] [, 3] [, 4] x 1 4 9 16 y 25 36 49 64 z 100 121 144 169
如果指定character = TRUE,则矩阵的每个元素都将被转换为字符。
apply(df, 1, fun, character = TRUE)
[, 1] [, 2] [, 3] [, 4] [1, ] "1" "4" "9" "16" [2, ] "25" "36" "49" "64" [3, ] "100" "121" "144" "169"
如果按列来应用这个函数,输出对应于你按行来应用这个函数时得到的转置矩阵。
apply(df, 2, fun)
x y z [1, ] 1 25 100 [2, ] 4 36 121 [3, ] 9 49 144 [4, ] 16 64 169
如果将函数应用于每个单元格,将得到以下结果:
apply(df, c(1, 2), fun)
x y z [1, ] 1 25 100 [2, ] 4 36 121 [3, ] 9 49 144 [4, ] 16 64 169
f <- function(x) sum(exp(x))
这个函数计算一个数字或向量的指数的和。
e为底的指数函数。例:exp(x)是e的 X次方。
所以如果逐行应用这个函数,会得到以下结果:
apply(df, 1, f)
22177.60 60284.96 163871.51 445448.95
例如,输出的第一个元素(22177.60)可以通过:sum(exp(1) + exp(5) + exp(10))得到。
如果你用列来应用这个函数,会得到以下结果:
apply(df, 2, f)
x y z 84.79102 4629.43310 687068.79094
最后,如果按行和列应用这个函数,输出将是一个包含每个元素指数的矩阵。
apply(df, 1:2, f)
x y z [1, ] 2.718282 148.4132 22026.47 [2, ] 7.389056 403.4288 59874.14 [3, ] 20.085537 1096.6332 162754.79 [4, ] 54.598150 2980.9580 442413.39
apply()函数的更多示例
apply(df, 2, min) # 按列计算最小值 apply(df, 2, range) # range(最小值和最大值)按列排列 apply(df, 1, summary) # 对每一行进行汇总 apply(df, 2, summary) # 对每个列进行汇总 # 将sum函数应用于多维数组 ar <- array(data = 1:18, dim = c(3, 2, 3)) apply(ar, 3, sum)
#最后一行的输出是数组中每个元素的所有组件之和。 [1] 21 57 93