【问题标题】:Assign results of apply to multiple columns of data frame将应用结果分配给数据框的多列
【发布时间】:2015-01-13 09:53:14
【问题描述】:

我想通过将函数f 应用于每一行来处理数据框df 中的所有行。由于函数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

【问题讨论】:

  • 你知道你可以做到矢量化,即没有apply,像这样:df$apb &lt;- df$a + df$b; df$amb &lt;- df$a * df$b
  • @docendodiscimus 是的,这只是玩具示例,我的真实函数要复杂得多——将其拆分为更多返回单个元素的函数/表达式并非易事。
  • 好的,我已经认为可能是这种情况..

标签: r apply


【解决方案1】:

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

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

【讨论】:

  • 不错的“midified”方法 :) +1
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 2020-10-24
    • 2012-06-28
    • 2022-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    相关资源
    最近更新 更多