2

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

4 回答 4

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
于 2013-09-09T03:56:51.660 回答
1

我觉得这withmapply在 a 中调用元素更好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
于 2013-09-09T04:01:09.730 回答
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
于 2013-09-09T04:57:35.557 回答
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将每一行或每一列输入函数时,它发送的是一个向量,而不是单独条目的列表。所以你应该给它一个带有单个(向量)参数的函数。

于 2013-09-09T03:56:49.920 回答