R:apply 与 do.call

标签 r apply do.call

我刚刚阅读了@David Arenburg 的简介,并找到了许多关于如何培养良好的 R 编程技能/习惯的有用技巧,其中一个特别让我印象深刻。我一直认为 R 中的 apply 函数是处理数据帧的基石,但他写道:

If you are working with data.frames, forget there is a function called apply- whatever you do - don't use it. Especially with a margin of 1 (the only good usecase for this function is to operate over matrix columns- margin of 2).

Some good alternatives: ?do.call, ?pmax/pmin, ?max.col, ?rowSums/rowMeans/etc, the awesome matrixStats packages (for matrices), ?rowsum and many more



有人可以向我解释一下吗?为什么应用函数不受欢迎?

最佳答案

  • apply(DF, 1, f)转换 DF 的每一行到一个向量,然后将该向量传递给 f。如 DF是字符串和数字的混合,然后该行将在将其传递给 f 之前转换为字符向量例如,apply(iris, 1, function(x) sum(x[-5]))即使行 iris[i, -5] 也不起作用包含所有数字元素。该行被转换为字符串,不能对字符串求和。另一方面apply(iris[-5], 1, sum)rowSums(iris[-5]) 的作用相同.
  • 如果 f产生一个向量,结果是一个矩阵而不是另一个数据框;此外,结果是您可能期望的转置。这个
    apply(BOD, 1, identity)
    

    给出以下而不是给出 BOD背部:
           [,1] [,2] [,3] [,4] [,5] [,6]
    Time    1.0  2.0    3    4  5.0  7.0
    demand  8.3 10.3   19   16 15.6 19.8
    

    许多年前哈德利·威克姆 (Hadley Wickham) 做过 post iapplyiapply(mat, 1, identity) 的意义上是幂等的返回 mat , 而不是 t(mat) ,其中 mat是一个矩阵。最近用他的 plyr 包可以写:
    library(plyr)
    ddplyr(BOD, 1, identity)
    

    并获得 BOD作为数据框返回。

  • 另一方面apply(BOD, 1, sum)将给出与 rowSums(BOD) 相同的结果和 apply(BOD, 1, f)可能对函数有用 f其中f产生一个标量并且没有对应物,例如 sum/rowSums案件。还有如果 f产生一个向量,你不介意矩阵结果你可以转置 apply 的输出你自己,虽然丑陋它会工作。

    关于R:apply 与 do.call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50717040/

    相关文章:

    r - 如何根据 R 中的索引向数据框添加列? (参见示例)

    r - R 中滑动窗口数据框中最常见的值

    r - 试图创造一个滚动周期 cummax

    r - sapply使用多列作为变量

    performance - 为什么 R 中的循环很慢?

    function - R:将字符串指定为调用另一个函数的函数的参数

    r - 在 R 中,为什么 is.integer(1) 返回 FALSE?

    r - 结合一个函数和 for 循环

    r - .call 如何对 data.frame 的行进行排序?

    r - 在 pmin 中使用 na.rm=T 和 do.call