我想在数据框上应用函数。该函数将V1作为arg1,V2作为arg2,我想将结果写入V3或其他一些向量。
有一种简单而紧凑的方法吗?我在下面发布了一个(非工作)示例。
由于
斯图
my.func <- function(X, Y) {
return(X + Y)
}
a <- c(1,2,3)
b <- c(4,5,6)
my.df <- data.frame(a, b)
apply(my.df, 1, my.func, X="a", Y="b")
答案 0 :(得分:4)
mapply()
就是这样做的。
以下任何一种都可以完成这项工作。第二种方法的优点是它可以很好地扩展到采用任意数量参数的函数。
mapply(my.func, my.df[,1], my.df[,2])
# [1] 5 7 9
do.call(mapply, c(FUN=list(my.func), unname(my.df)))
# [1] 5 7 9
答案 1 :(得分:1)
如果您在with
内调用元素,我觉得使用mapply
比使用data.frame
会更好:
with(my.df,my.func(X=a,Y=b))
#[1] 5 7 9
即使您需要从矩阵进行显式转换,它仍然是一个非常干净的方法:
with(data.frame(my.mat),my.func(X=a,Y=b))
#[1] 5 7 9
答案 2 :(得分:1)
此处不需要*apply
功能。矢量化就足够了:
my.df$c <- my.df$a + my.df$b
# a b c
#1 1 4 5
#2 2 5 7
#3 3 6 9
您的apply
解决方案无法按照您编写的方式运行,因为apply
未将命名向量传递给您的函数:例如
colnames(my.df)
#[1] "a" "b"
apply( my.df , 1 , colnames )
#NULL
答案 3 :(得分:0)
对于您的示例,rowSums(my.df)
将完成这项工作。对于更复杂的任务,您可以使用mapply
功能。例如:mapply(my.func, my.df[a], my.df[b])
。
或者,您可以重写函数以获取向量参数:
my.otherfunc <- function(x) sum(x)
apply(my.df, 1, my.otherfunc)
重要的是要了解当apply
将每行或每列都输入到函数中时,它会发送一个向量,而不是单独的条目列表。所以你应该给它一个带有单个(向量)参数的函数。