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
参考
往期文章:
网友评论