【问题标题】:Combination of group_by and select in dplyr [duplicate]dplyr中group_by和select的组合[重复]
【发布时间】:2021-07-20 11:24:26
【问题描述】:

我已经检查了 group_by 函数以选择 mtcars 中一种气缸类型的平均分布,但它没有给我正确的答案。见下文;

summarise(group_by(mtcars,cyl), mean(disp))

输出:

> summarise(group_by(mtcars,cyl), mean(disp))
# A tibble: 3 x 2
    cyl `mean(disp)`
  <dbl>        <dbl>
1     4         105.
2     6         183.
3     8         353.

但是

summarise(group_by(mtcars,cyl = 6), mean(disp))

输出:

> summarise(group_by(mtcars,cyl = 6), mean(disp))
# A tibble: 1 x 2
    cyl `mean(disp)`
  <dbl>        <dbl>
1     6         231.

注意:我想根据第一个代码对 6 型气缸得到相同的答案。但答案不同。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你不能得到相同的答案: 这是因为无论您是 group_by cyl 还是 group_by cyl= 6,n 和 sum 都在变化。因此均值不同: 看这个例子,主要看和n和sum作为均值是sum/n:

    mtcars %>% 
      group_by(cyl = 6) %>% 
      summarise(mean(disp), n=n(), sum_disp=sum(disp), Mean2 = sum_disp/n)
    
    mtcars %>% 
      group_by(cyl) %>% 
      summarise(mean(disp), n=n(), sum_disp=sum(disp), Mean2 = sum_disp/n)
    

    输出:

    > mtcars %>% 
    +   group_by(cyl = 6) %>% 
    +   summarise(mean(disp), n=n(), sum_disp=sum(disp), Mean2 = sum_disp/n)
    # A tibble: 1 x 5
        cyl `mean(disp)`     n sum_disp Mean2
      <dbl>        <dbl> <int>    <dbl> <dbl>
    1     6         231.    32    7383.  231.
    > mtcars %>% 
    +   group_by(cyl) %>% 
    +   summarise(mean(disp), n=n(), sum_disp=sum(disp), Mean2 = sum_disp/n)
    # A tibble: 3 x 5
        cyl `mean(disp)`     n sum_disp Mean2
      <dbl>        <dbl> <int>    <dbl> <dbl>
    1     4         105.    11    1156.  105.
    2     6         183.     7    1283.  183.
    3     8         353.    14    4943.  353.
    

    【讨论】:

    • 好的,我明白了其中的区别。谢谢!
    • 谢谢。当然。
    • 为什么n() 会发生变化?这是因为cyl=6 创建了一个名为 cyl 的列,其中的所有值都只有 6。所以从技术上讲,是对数据集中所有点的总和/平均值。
    【解决方案2】:

    我认为您正在寻找比较运算符,它是 == 而不是 =,它应该在 filter 中使用。 cyl = 6 只会将所有 cyl 值更改为 6 并返回所有 disp 值的意思,即 mean(mtcars$disp)

    library(dplyr)
    
    mtcars %>%
      group_by(cyl) %>%
      summarise(mean_disp = mean(disp)) 
    
    #  cyl mean_disp
    #1   4  105.1364
    #2   6  183.3143
    #3   8  353.1000
    
    mtcars %>%
      filter(cyl == 6) %>%
      summarise(mean_disp = mean(disp))
    
    #  mean_disp
    #1  183.3143
    

    【讨论】:

      猜你喜欢
      • 2021-04-17
      • 2017-09-27
      • 1970-01-01
      • 2016-12-03
      • 2015-09-19
      • 2020-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      相关资源
      最近更新 更多