【问题标题】:R: Creating a new row based on previous rowsR:根据以前的行创建新行
【发布时间】:2019-03-06 00:01:59
【问题描述】:

我是 R 新手,正在尝试根据前几行的值创建一个新行。

样本数据:

df <- data.table(Item = c("a", "b", "c", "d"),
                 "2010FY" = c(3, 5, 2, 2),
                 "2011FY" = c(5, 6, 2, 1),
                 "2012FY" = c(-1, 2, 2, 0.5))

我想创建一个新行,将第 3 行除以第 4 行。让我们将此项目称为“e”,理想情况下应该是这样的:

    Item     2010FY     2011FY     2012FY
1     a        3          5          -1
2     b        5          6           2
3     c        2          2           2
4     d        2          1          0.5
5     e        1          2           4

使用 dplyr,我的第一次尝试是:

 df <- bind_rows(df, e = df[Item %in% "c", ] / df[Item %in% "d", ])

这不起作用,因为字符不可分割(即,项目列)。

我发现函数 mutate_if 可以工作,但只能按列。有没有办法我可以逐行做到这一点?

非常感谢。

【问题讨论】:

  • 我不确定dplyr 是否真的适合这种操作,因为它倾向于对整列而不是行和子集进行操作。您可能可以使用与您正在执行的操作类似的操作在管道外执行此操作 - rbind(df, c(Item="e", df[df$Item == "c", -1] / df[df$Item == "d", -1]))
  • 感谢您的回复。这行得通!我假设 -1 忽略第一列 Item 仅对数字列执行计算?
  • 是的,没错。
  • 太棒了,谢谢!
  • 仅供参考,您可以回答自己的问题。这有助于有类似问题的用户快速找到解决方案!

标签: r dplyr data.table row


【解决方案1】:

正如上面的 cmets 所指出的,这很有效:

rbind(df, c(Item="e", df[df$Item == "c", -1] / df[df$Item == "d", -1])) 

【讨论】:

    猜你喜欢
    • 2021-11-11
    • 2021-11-08
    • 1970-01-01
    • 2020-03-16
    • 2019-11-10
    • 1970-01-01
    • 2021-12-17
    • 2021-08-24
    • 2023-03-15
    相关资源
    最近更新 更多