【问题标题】:Sum two columns line by line将两列逐行求和
【发布时间】:2014-12-05 13:28:35
【问题描述】:

我想在我的数据框中创建一个列,我可以将数据框的另外两列相加。

df <- data.frame(x = 1:10, y = 11:20)

例如,我想在我拥有的地方添加第三列 z:

z <- c(12, 14, 16,..., 30)

提前致谢。

【问题讨论】:

  • 你是怎么解决的?
  • 这对我来说没问题。如果您不喜欢它,请投反对票。

标签: r dataframe


【解决方案1】:
df <- data.frame(x = 1:10, y = 11:20)
df$z<-c(df$x+df$y)
df

    x  y  z
1   1 11 12
2   2 12 14
3   3 13 16
4   4 14 18
5   5 15 20
6   6 16 22
7   7 17 24
8   8 18 26
9   9 19 28
10 10 20 30

【讨论】:

  • with 的功能在这里很方便。 df$z &lt;- with(df, x + y).
【解决方案2】:

R 中的算术是vectorized。这是一个非常重要的概念,您应该阅读。数据框中的列是向量,因此您的解决方案很简单:

df$z <- df$x + df$y
df$z
## [1] 12 14 16 18 20 22 24 26 28 30

就像您刚刚拥有 xy 独立向量一样:

x <- 1:10
y <- 11:20
x + y
## [1] 12 14 16 18 20 22 24 26 28 30

【讨论】:

    【解决方案3】:

    函数rowSums 可以解决问题:

    df$z <- rowSums(df)
    

    结果:

        x  y  z
    1   1 11 12
    2   2 12 14
    3   3 13 16
    4   4 14 18
    5   5 15 20
    6   6 16 22
    7   7 17 24
    8   8 18 26
    9   9 19 28
    10 10 20 30
    

    【讨论】:

      【解决方案4】:

      使用 data.table :

      > library(data.table)
      > setDT(df)[,z:=x+y,]
      > df
           x  y  z
       1:  1 11 12
       2:  2 12 14
       3:  3 13 16
       4:  4 14 18
       5:  5 15 20
       6:  6 16 22
       7:  7 17 24
       8:  8 18 26
       9:  9 19 28
      10: 10 20 30
      

      【讨论】:

        【解决方案5】:

        使用 dplyr:

        library(dplyr)
        df %>% group_by(x) %>% mutate(z = sum(x+y))
        

        我在这个答案中学到的其他两个选项,以避免分组和写列名称Sum across multiple columns with dplyr

        df %>% mutate(z = Reduce(`+`, .))
        df %>% mutate(z = rowSums(.))
        

        输出:

        Source: local data frame [10 x 3]
        Groups: x
        
            x  y  z
        1   1 11 12
        2   2 12 14
        3   3 13 16
        4   4 14 18
        5   5 15 20
        6   6 16 22
        7   7 17 24
        8   8 18 26
        9   9 19 28
        10 10 20 30
        

        【讨论】:

        • 为什么要按x分组?
        • @Richard Scriven 如果我不按 x 分组,df %&gt;% mutate(z = sum(x+y)),z 列将是每行 210(df$x+df$y 的总和)。我可以使用df %&gt;% mutate(z = rowSums(.))df %&gt;% mutate(z = Reduce(+, .)) 来避免分组。我会将它们添加到我的答案中。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多