将应用结果分配给多列数据框

时间:2015-01-13 09:53:15

标签: r apply

我想通过将函数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

2 个答案:

答案 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