使用apply和multi参数函数

时间:2013-09-09 03:33:33

标签: r

我想在数据框上应用函数。该函数将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")

4 个答案:

答案 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将每行或每列都输入到函数中时,它会发送一个向量,而不是单独的条目列表。所以你应该给它一个带有单个(向量)参数的函数。