【问题标题】:Sum rows based on names and create new df根据名称对行求和并创建新的 df
【发布时间】:2020-03-13 12:57:17
【问题描述】:

我需要个人项目的帮助!

我有一个像这样的 df(姓名 x 日期)

       Name1 Name2 Name3 Name3 Name 4 Name5 Name6 Name 3
Date 1    x1    x2    x3    x4    x5     x6    x7     x8
Date 2    y1    y2    y3    y4    y5     y6    y7     y8
Date 3    z1    z2    z3    z4    z5     z6    z7     y8

等等……

我想像这样转换它

       Name1 Name2   Name3  Name 4 Name5 Name6
Date 1    x1    x2 x3+x4+x8   x5    x6    x7
Date 2    y1    y2 y3+y4+y8   y5    y6    y7
Date 3    z1    z2 z3+z4+z8   z5    z6    z7

或者创建一个像这样的新df。 有什么容易做的吗? 提前谢谢!

【问题讨论】:

  • 你是如何得到相同的列名的?另外请分享一个可重复的示例,以便我们可以在会话中复制/粘贴它
  • 列同名是非常糟糕的做法。如果您有不同的列名,您可以使用 tidyr 并使用 df %>% unite("Name3", c(4,5,9), sep='+')
  • 我认为您需要使用这个特定数据集的确切输出,如果是的话,我有解决方案,列名重复,所以我将取消删除我的答案。但是,正如 Sotos 所说,您可能需要重复列(名称)的数值总和,如果是,请提供可重现的示例,但是您已经有了答案。

标签: r rowsum


【解决方案1】:

我们可以使用split.default()来拆分同名的列,然后取这些列的总和,即

d1 <- cbind.data.frame(a = sample(5), b = sample(5), a = sample(5), c = sample(5), b = sample(5))
#  a b a c b
#1 1 1 3 5 1
#2 4 3 2 1 5
#3 3 2 5 2 2
#4 5 4 4 3 4
#5 2 5 1 4 3

#Sum columns with the same name
do.call(cbind.data.frame, lapply(split.default(d1, names(d1)), rowSums))
#  a b c
#1 4 2 5
#2 6 8 1
#3 8 4 2
#4 9 8 3
#5 3 8 4

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 2018-09-09
    • 2021-09-20
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-23
    • 2023-01-18
    相关资源
    最近更新 更多