apply | R中函数的简单循环

简介: R中的apply族函数是一组R向量化函数,允许通过数组执行复杂的任务,避免使用for循环。

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

参考


https://r-coder.com/apply-r/


相关文章
|
1月前
|
JavaScript 前端开发 开发者
call 方法和 apply 方法的区别是什么?
【10月更文挑战第26天】`call` 方法和 `apply` 方法的主要区别在于参数传递方式和使用场景。开发者可以根据具体的函数参数情况和代码的可读性、简洁性要求来选择使用 `call` 方法还是 `apply` 方法,以实现更高效、更易读的JavaScript代码。
35 2
|
6月前
|
JavaScript 前端开发
call和apply的区别
call和apply的区别
|
6月前
call()与apply()的作用与区别?
call()与apply()的作用与区别?
|
7月前
call()与apply()的作用与区别
call()与apply()的作用与区别
66 1
|
Python
apply函数的用法
apply是pandas处理数据经常用到的函数。我们可以用DataFrame的apply函数实现对多列、多行的操作。可通过axis设置参数,设为1是对列进行操作,参数axis设为0是对行操作。apply经常跟lambda一起使用,非常方便,大大提高了效率。
167 0
|
7月前
switch 语句,while 循环,for 循环和do while循环
switch 语句,while 循环,for 循环和do while循环
51 0
|
7月前
|
JavaScript 前端开发
call函数和apply函数的区别
call函数和apply函数的区别
57 0
普通函数中的this指向问题解决方案apply
普通函数中的this指向问题解决方案apply
68 0
普通函数中的this指向问题解决方案apply
普通函数中的this指向问题解决方案apply
54 0