【问题标题】:How can I keep columns when grouping/summarizing?分组/汇总时如何保留列?
【发布时间】:2016-08-14 09:34:47
【问题描述】:

所以,这个问题的问题是,我无法发布实际代码,因为我必须签署一份协议,而且我是 R 的新手,可能无法很好地解释这一点,但也许有人可以帮助我.. .

假设我有一些数据:

A   B    C   D
F1  6.6  10  10
F1  3.1  10  10
A1  1.0  20  10
B1  3.4  20  20

因此,对于每个 A,C 和 D 值都是相同的。 但我想像这样使用 dplyr 来查找 Bmean:

A    Bmean   C    D
F1   4,85    10  10
A1   1.0     20  10
B1   3.4     20  20

我该怎么做?我的想法是使用类似的东西

dplyr::group_by(A) %>% dplyr::summarize(Bmean = mean(B))

但 C 和 D 在此操作后似乎消失了。 对我想保留的所有列进行分组是否有意义? 或者这将如何运作?

澄清一下,我想使用 dplyr 语法,因为如果可能的话,它是更大操作的一部分。

【问题讨论】:

  • 这样的事情对你有用吗? group_by(df, A, C, D) %>% summarize(Bmean = mean(B)) 然后,你有 CD

标签: r dplyr


【解决方案1】:

您可以使用base R 来做到这一点

aggregate(data=df1,B~.,FUN = mean)

【讨论】:

    【解决方案2】:

    你可以简单地使用这样的东西:

    aggregate(cbind(B, C, D) ~ A, df, mean)
    

    这里的 df 是包含 A、B、C 和 D 列的数据框。

    【讨论】:

      【解决方案3】:

      我们可以使用data.table

      library(data.table)
      setDT(df1)[,.(Bmean = mean(B)) , .(A, C, D)]
      #     A  C  D Bmean
      #1: F1 10 10  4.85
      #2: A1 20 10  1.00
      #3: B1 20 20  3.40
      

      【讨论】:

        【解决方案4】:

        我想添加一个专门解决使用 dplyr 的问题的 awnser。虽然我敢肯定,有更优雅的方法可以做到这一点,但以下建议可以在汇总/聚合数据框中保留带有其他描述性变量的列。此外,如果不是这种情况,代码将无法保护您免受更大数据帧中的错误。

        以下代码删除列 C 和 D

        library(dplyr)
        library(tibble)
        
        df <- tribble(
          ~A  , ~B , ~c , ~D ,
          "F1", 6.6, 10 , 10 ,
          "F1", 3.1, 10 , 10 ,
          "A1", 1.0, 20 , 10 ,
          "B1", 3.4, 20 , 20
        )
        

        以下代码删除列 C 和 D

        df %>%
          group_by(A) %>%
          summarise(Bmean = mean(B)) 
        

        此代码保留 C 和 D 列。请注意,这仅适用于组的每一行中存在相同变量的情况。但是由于变量应该被保留并且不会对分组行为产生影响,所以无论如何都应该是这种情况。

        df %>%
          group_by(A) %>%
          summarise(Bmean = mean(B),
                    C = unique(C),
                    D = unique(D))
        

        更新:

        事实上,如果分组级别不“小于”分组变量,您也可以在 group_by 表达式中包含组

        Group1:
          A ,  B ,  C ,  D
        "F1", 6.6, 10 , 10 
        "F1", 3.1, 10 , 10 
        Group2:
        "A1", 1.0, 20 , 10 
        Group3:
        "B1", 3.4, 20 , 20
        

        请注意,C 列和 D 列在每个组中保持相同的值。 这意味着它们可以安全地用于分组表达式,因此可以 保留。

        所以在你的情况下,这也可以:

        group_by(A,C,D)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-01
          • 2020-06-18
          • 1970-01-01
          • 2016-12-29
          • 2022-07-21
          • 2018-07-23
          • 2021-02-01
          • 2019-11-19
          相关资源
          最近更新 更多