apply | R中函数的简单循环

作者: 木舟笔记 | 来源:发表于2021-04-28 10:39 被阅读0次
210428jpg.jpg

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包)

相关文章

  • R语言中apply家族函数介绍

    R语言中的以apply()函数为首的apply()家族,提供了强大而方便的循环功能,这些函数说起来简单,用起来可能...

  • apply | R中函数的简单循环

    apply 的简单用法指南 R中的apply族函数是一组众所周知的R向量化函数,允许通过数组执行复杂的任务,避免使...

  • apply 函数家族

    apply 函数的主要优点是我们可以摆脱循环操作。r 中的应用族包含 apply()、lapply()、sappl...

  • apply函数族介绍-来源网络

    1 、 apply函数 数据量比较大的时候,R 语言for循环非常的慢,apply函数是最常用的代替for循环的函...

  • R 中for 循环替代函数:apply、Map及purrr::m

    R 中apply函数、Map函数及purrr包的map函数 apply()函数算是R语言里面很基础的一个函数,同时...

  • apply函数家族及其应用

    apply函数家族是R语言中数据处理的一组核心函数,通过使用apply函数,我们可以实现对数据的循环、分组、过滤、...

  • mapply函数

    apply函数系列是R面向数组设计的体现,也是避免for循环的神器。apply函数簇是一系列功能类似对数组或者列表...

  • R数据分析:apply()的各种变体你分清了吗?

    apply函数可以看作是循环的替代方法,在R语言中,apply函数的变体有很多,好多时候同学搞不清到底该用appl...

  • R语言利器---apply函数族

    循环对于代码运行来说是非常消耗时间和资源的,在R中,要尽量少使用for while循环,用apply函数族的话对于...

  • 2019-07-23

    R语言中的apply函数族 1、lapply函数 lapply函数是一个最基础循环操作函数之一,用来对list、d...

网友评论

    本文标题:apply | R中函数的简单循环

    本文链接:https://www.haomeiwen.com/subject/fcfvrltx.html