【问题标题】:R: how to sum columns grouped by a factor?R:如何对按因子分组的列求和?
【发布时间】:2018-01-25 20:41:17
【问题描述】:

如果我有这样的表:

user,v1,v2,v3
a,1,0,0
a,1,0,1
b,1,0,0
b,2,0,3
c,1,1,1

我怎么把它变成这个?

user,v1,v2,v3
a,2,0,1
b,3,0,3
c,1,1,1

【问题讨论】:

    标签: r data-cleaning


    【解决方案1】:

    在基础 R 中,

    D <- matrix(c(1, 0, 0,
                  1, 0, 1,
                  1, 0, 0,
                  2, 0, 3,
                  1, 1, 1),
                ncol=3, byrow=TRUE, dimnames=list(1:5, c("v1", "v2", "v3")))
    D <- data.frame(user=c("a", "a", "b", "b", "c"), D)
    aggregate(. ~ user, D, sum)
    

    返回

    > aggregate(. ~ user, D, sum)
      user v1 v2 v3
    1    a  2  0  1
    2    b  3  0  3
    3    c  1  1  1
    

    【讨论】:

      【解决方案2】:

      您可以为此使用dplyr

      library(dplyr)
      df = data.frame(
        user = c("a", "a", "b", "b", "c"),
        v1   = c(1, 1, 1, 2, 1),
        v2   = c(0, 0, 0, 0, 1),
        v3   = c(0, 1, 0, 3, 1))
      
      group_by(df, user) %>% 
      summarize(v1_sum = sum(v1),
                v2_sum = sum(v2),
                v3_sum = sum(v3))      
      

      如果您不熟悉 %&gt;% 表示法,它基本上就像来自 bash 的管道。它从group_by() 获取输出并将其放入summarize()。同样的事情会以这种方式完成:

      by_user = group_by(df, user)
      df_summarized = summarize(by_user, 
                                v1_sum = sum(v1),
                                v2_sum = sum(v2),
                                v3_sum = sum(v3))  
      

      【讨论】:

      • 适用于整数和舍入数字,但对于带小数的数字,它会舍入数字(取决于使用的 RStudio 版本,例如 v1.2.5042 小数已消失,尽管 getOption("digits") =7)。解决方法是在它之后使用 %>% as.data.frame() 。下面的带有 aggregate() 的解决方案默认保留小数,并且更加自描述和直观,虽然有点慢。
      • @alp 小数点没有消失,但是当使用 dplyr 时,输出是一个“tibble”对象,它是一个带有一些附加属性的 data.frame,其中之一是它们没有如果值足够大,则在打印时显示小数。所以这些值仍然存在,但在屏幕上打印时它们不会显示。通过将输出传递到“as.data.frame()”,您可以将其转换回默认情况下打印小数的 data.frame。
      猜你喜欢
      • 1970-01-01
      • 2019-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 1970-01-01
      相关资源
      最近更新 更多