如何将自定义多变量函数应用于R中数据帧的每一行?

时间:2013-06-30 21:51:24

标签: r function dataframe

假设我有一个名为“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的变量名必须映射到mydata的列名。什么是一般解决方案?

3 个答案:

答案 0 :(得分: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))

答案 1 :(得分:6)

您可以使用mapply

mapply(myfunction, mydata$foo, mydata$bar)

答案 2 :(得分:1)

Vectorize是针对这种情况设计的mapply的语法糖。它非常有用,可以将复杂的代码导入到期望它的R函数中,例如outerintegrateuniroot等。

myfunction <- Vectorize(myfunction)

myfunction(mydata$foo, mydata$bar)