我想通过将函数df
应用于每一行来处理数据框f
中的所有行。当函数f
返回带有两个元素的数字向量时,我想将单个元素分配给df
中的新列。
示例df
,琐碎的函数f
使用apply
df <- data.frame(a = 1:3, b = 3:5)
f <- function (a, b) {
c(a + b, a * b)
}
df[, c('apb', 'amb')] <- apply(df, 1, function(x) f(a = x[1], b = x[2]))
这不起作用结果按列分配:
> df
a b apb amb
1 1 3 4 8
2 2 4 3 8
3 3 5 6 15
答案 0 :(得分:3)
您也可以使用Reduce
代替apply
,因为它通常更有效率。您只需稍微修改您的功能即可使用cbind
代替c
f <- function (a, b) {
cbind(a + b, a * b) # midified to use `cbind` instead of `c`
}
df[c('apb', 'amb')] <- Reduce(f, df)
df
# a b apb amb
# 1 1 3 4 3
# 2 2 4 6 8
# 3 3 5 8 15
注意:如果您只有两列(如示例所示),这只能很好地工作,因此如果您的数据集中有更多列,则仅在子集上运行
答案 1 :(得分:1)
您需要转置apply
结果才能获得所需内容:
df[, c('apb', 'amb')] <- t(apply(df, 1, function(x) f(a = x[1], b = x[2])))
> df
a b apb amb
1 1 3 4 3
2 2 4 6 8
3 3 5 8 15