无法将功能应用于数据框

时间:2018-06-13 15:57:14

标签: r

玩具示例:

> myfn = function(a,x){sum(a*x)}
> myfn(a=2, x=c(1,2,3))
[1] 12

到目前为止很好。现在:

> df = data.frame(a=c(4,5))
> df$ans = myfn(a=df$a, x=c(1,2,3))
Warning message:
In a * x : longer object length is not a multiple of shorter object length

> df
  a ans
1 4  26
2 5  26

我想要发生的是,对于第一行,就好像我调用了myfn(a=4, x=c(1,2,3),给出了24的答案,对于第二行,就好像我调用{ {1}}给出答案30.我该怎么做?谢谢。

编辑:稍微复杂的版本。现在假设函数是

myfn(a=5, x=c(1,2,3)

我有数据框

myfn = function(a,b, x){sum((a+b)*x)}

我想要创建df = data.frame(a=c(4,5), b=c(6,7), c=c(9,9)) ,这样第一行就好像我调用df$ans而第二行就好像我调用了myfn(a=4, b=6, x=c(1,2,3),即对myfn(a=5, b=7, x=c(1,2,3)使用df$xa使用df$y,忽略b

2 个答案:

答案 0 :(得分:2)

这样的事情会起作用:

myfn = function(a,x){
  return(sum(a*x))
  }

df <- data.frame(a=c(4,5))
df$ans <- apply(df, 1, myfn, x = c(1,2,3))
df$ans

  a ans
1 4  24
2 5  30

**根据用户编辑进行编辑**

df = data.frame(a=c(4,5), b=c(6,7), c=c(9,9))
df$ans <- apply(df[, c("a", "b")], 1, function(y) sum((y['a']+y['b'])*c(1,2,3)))
  a b c ans
1 4 6 9  60
2 5 7 9  72

答案 1 :(得分:1)

有几种方法可以做到,每种方式都有它自己的魅力。如果你不想修改我会做的功能

mapply(myfn, df$x, df$y, MoreArgs = list(x = 1:3))

或者,您可以将迭代直接烘焙到函数中,例如

myfn = function(a,b, x){
    sapply(a+b, function(ab) {
        sum(ab*x)
    })
}
myfn(df$x, df$y, 1:3)

这可能就像我做的那样。

相关问题