我刚刚阅读了@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
iapply
在 iapply(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/