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

Assign results of apply to multiple columns of data frame

我想通过对每一行应用函数 f 来处理数据框 df 中的所有行。作为具有两个元素的函数 f returns 数值向量,我想将各个元素分配给 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

您需要转置 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

您也可以使用 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

注意:只有当您只有两列(如您的示例)时,这才会很好地工作,因此如果您的数据集中有更多列,运行 这仅在一个子集上