4

假设我有一个数据框,其中包含名为“foo”和“bar”的列

mydata <- data.frame(foo=rnorm(100), bar=rnorm(100))

并假设我有一个自定义标量函数,它期望标量输入“x”和“y”并产生一个标量输出,例如

myfunction <- function(x, y) { if (x>0) y else x }

如何将 myfunction 应用于 mydata 的每一行,其中 x 为 foo,y 为 bar?

是的,我知道这个具体的例子非常简单,在 R 中可以很容易地完成,但我对模式很感兴趣。想象一下 myfunction 非常复杂,myfunction 的变量名必须映射到列名我的数据。一般解决方案是什么?

4

3 回答 3

6
mydata <- data.frame(x=rnorm(100), y=rnorm(100))
myfunction <- function(x, y) { if (x>0) y else x }

# with plyr (requires the argument names to match)
plyr::mdply(mydata, myfunction)

# with base functions
with(mydata, mapply(myfunction, x, y))
于 2013-06-30T21:58:52.577 回答
6

您可以使用mapply

mapply(myfunction, mydata$foo, mydata$bar)
于 2013-06-30T21:59:03.857 回答
1

Vectorizemapply是为这种情况设计的语法糖。它对于将复杂的代码向量化以输入到期望它的 R 函数中非常有用,例如outer, integrate,uniroot等。

myfunction <- Vectorize(myfunction)

myfunction(mydata$foo, mydata$bar)
于 2013-07-01T02:19:16.923 回答