apply | R中函数的简单循环

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

注:前面的示例仅作教学。使用colSumsrowSums函数分别计算列和行的和更有效。

对整个数据框应用函数

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)eX次方。

所以如果逐行应用这个函数,会得到以下结果:

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

参考

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


往期文章:

aggregate | 在R中进行分组统计

跟着Cell学作图 | 6.时间序列分析(Mfuzz包)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值