玩具示例:
> 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$x
,a
使用df$y
,忽略b
。
答案 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)
这可能就像我做的那样。