【问题标题】:anonymous function with multiple parameters具有多个参数的匿名函数
【发布时间】:2013-11-05 16:14:52
【问题描述】:

不要问我的例子是否合理,也许有一些例子可以绕过我的问题,但也许不可能将多个参数传递给一个应该按组应用于 data.frame 的匿名函数

我有一个data.frame

w <- c("A", "B")
x <- c(1,2)
y <- c(3,4)

df <- data.frame(w,x,y)

现在我想对每个组(由 w 列定义)应用一个函数,该函数通过将 x 和 y 列相乘来创建 z 列

df$z

实际上,我并不是在询问乘法的具体答案,而是询问如何将两个或多个参数应用于匿名函数的语法。

由于 Joshua 的正确评论,我更改了示例,tapply 不适用于列表。

任何提示表示赞赏

汤姆

【问题讨论】:

  • 我不会问这是否合理。我会告诉你不是。 :) tapply 适用于原子X(请参阅?tapply)。列表不是原子的。
  • 感谢 Joshua,但我的问题仍然存在,如何将多个参数应用于 data.frame 中的匿名函数
  • @TomMartens 分组?
  • 不一定要分组,但我想将参数传递给匿名函数
  • 您可能正在寻找mapply

标签: r


【解决方案1】:

如果我理解正确,这是一种方式:

do.call(mapply, c(function(x, y) x * y, df[-1]))
# [1] 3 8

data.frame 中的列数(例如,删除 ID 列之后)必须与匿名函数中的参数数相匹配。

或者,如果您想明确指定列:

mapply(function(x,y) x * y, df$x, df$y)

【讨论】:

  • 谢谢马修,mapply 工作。它也可以在没有 do.call 的情况下工作: df$z
  • 是的,如果您知道列数与参数数匹配,do.call 只是为了方便。
【解决方案2】:

当您可以将内置函数用作Reduceapply*prod 时,不明白为什么要使用匿名用户定义函数。考虑到这个data.frame:

  w x y
1 A 1 3
2 B 2 4
3 A 3 6
4 A 4 1
5 B 5 2

> Reduce("*", df[,-1])
[1]  3  8 18  4 10

> apply(df[,-1], 1, prod)
[1]  3  8 18  4 10

【讨论】:

  • Jilber,感谢您的回答,但在这个解决方案中,没有匿名函数,我的问题更多是关于匿名函数而不是使用 prod - 抱歉。