我想在数据框上应用一个函数。该函数将 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")
我想在数据框上应用一个函数。该函数将 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")
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
我觉得这with比mapply在 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
这里实际上不需要*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
对于您的示例,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将每一行或每一列输入函数时,它发送的是一个向量,而不是单独条目的列表。所以你应该给它一个带有单个(向量)参数的函数。