【问题标题】:How to use group_by to compare averages between groups如何使用 group_by 比较组间的平均值
【发布时间】:2020-07-17 17:08:44
【问题描述】:

我正在使用这个 hiphop 数据集 (https://www.dropbox.com/s/5d8fwxrj3jtua1z/hiphop.csv?dl=0)。我正在尝试比较男性和女性之间每种音乐类型(声乐、古典、民谣、摇滚、乡村、流行、另类、嘻哈和不可分类)的平均值。我使用以下代码按性别变量分组以获取每个级别和每个变量的平均值。

music_diff <- hiphop %>%
  select(subj, sex, age, ethnic, ethnic_binary, intl:unclassifiable)
sex_music_diff <- music_diff %>%
  group_by(sex) %>%
  summarize(avg_intl=mean(intl), avg_vocal=mean(vocal), avg_classical =mean(classical), avg_folk=mean(folk), avg_rock=mean(rock), avg_country =mean(country), avg_pop=mean(pop), avg_alt = mean(alternative), avg_hiphop=mean(hiphop), avg_unclassifiable=mean(unclassifiable), .groups="keep")

这给了我每组内男性和女性受试者的平均值表。我现在要做的是使用它给我的输出来查找男性和女性之间不同的变量。换句话说,我想减去男性和女性的 avg_intl,男性和女性的 avg_vocal 等等,然后返回每个变量的差异列表。我试过了:

sex_music_diff %>%
+ avg_intl$Male - avg_intl$Female

但我收到一条错误消息,提示“3 个参数传递给 '$',需要 2 个”。不知道有什么更好的方法来解决这个问题。理想情况下,这将是所有变量差异的一个步骤,它将返回所有差异的数据帧。提前致谢。

【问题讨论】:

    标签: r group-by dplyr


    【解决方案1】:

    如果我们需要在%&gt;% 中执行此操作,请根据逻辑向量对“avg_int”进行子集化

    library(dplyr)# 1.0.0
    sex_music_diff %>%
            ungroup %>%
            summarise(Diff = avg_intl[sex == 'Male'] - avg_intl[sex == 'Female'])
    #  Diff
    #1  0.3
    

    如果我们想对所有 'avg' 变量执行此操作

    sex_music_diff %>%
            ungroup %>%
            summarise(across(starts_with('avg'), 
                 ~ .[sex == 'Male'] - .[sex == 'Female']))
    #avg_intl avg_vocal avg_classical avg_country avg_pop avg_hiphop avg_unclassifiable
    #1      0.3      -1.4          -1.2        -0.2    -0.3       -1.1               -0.2
    

    或使用base R

    with(sex_music_diff, avg_intl[sex == 'Male'] - avg_intl[sex == 'Female'])
    #[1] 0.3
    

    或者因为只有两行,可以用diff完成

    with(sex_music_diff, diff(avg_intl))
    #[1] -0.3
    

    或者对于所有的 'avg' 变量

    nm1 <- startsWith(names(sex_music_diff), 'avg')
    diff(as.matrix(sex_music_diff[nm1]))
    #     avg_intl avg_vocal avg_classical avg_country avg_pop avg_hiphop avg_unclassifiable
    #[1,]     -0.3       1.4           1.2         0.2     0.3        1.1                0.2
     
    

    根据 OP 的代码,“avg_intl”是单独的列,“Sex”是单独的。因此,我们不能提取 $Male$Female,就好像 'avg_intl' 是一个已创建的对象。

    数据

    sex_music_diff <- data.frame(sex = c('Male', 'Female'), 
    avg_intl = c(5.2, 4.9), avg_vocal = c(6.5, 7.9),
    avg_classical = c(1.2, 2.4), avg_country = c(2.3, 2.5), 
    avg_pop = c(3.2, 3.5), avg_hiphop= c(2.4, 3.5), 
    avg_unclassifiable = c(2.2, 2.4))
    

    【讨论】:

    • 如何同时对多个变量执行此操作?我想减去男性和女性的所有平均变量,并在向量或数据框中获得输出。当我运行 dplyr 版本时,我得到一个空的 tibble。基本 r 版本有效,但我不知道如何同时处理多个差异。
    • @HannahHarder 在dplyr,我认为你需要ungroup,因为你使用了.groups = 'keep'
    • 当我添加 sex_music_diff %>% summarise(across(starts_with('avg'), ~ .[sex == 'Male'] - .[sex == 'Female'])) 到我的代码,它返回一个空数据集并显示“表中没有可用数据”。
    • @HannahHarder 你有group_by.groups = 'keep' 你能在summarise 之前添加ungroup
    • @HannahHarder 我更新了我使用的数据,它对我有用
    【解决方案2】:

    试试这个方法

    library(tidyverse)
    music_diff %>% 
      group_by(sex) %>% 
      summarise(across(intl:unclassifiable, mean, na.rm = T, .names = "avg_{col}")) %>% 
      pivot_longer(-sex) %>% 
      pivot_wider(name, names_from = sex, values_from = value) %>% 
      mutate(Diff = Male - Female)
    
    # A tibble: 10 x 4
       name               Female   Male     Diff
       <chr>               <dbl>  <dbl>    <dbl>
     1 avg_intl           0.444  0.255  -0.190  
     2 avg_vocal          0.880  1.57    0.688  
     3 avg_classical      0.752  0.941   0.189  
     4 avg_folk           0.402  0.392  -0.00955
     5 avg_rock           1.93   3.06    1.13   
     6 avg_country        0.786  0.392  -0.394  
     7 avg_pop            1.30   1.10   -0.201  
     8 avg_alternative    2.21   2.16   -0.0568 
     9 avg_hiphop         1.62   1.53   -0.0945 
    10 avg_unclassifiable 0.0598 0.0392 -0.0206 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 2019-07-03
      • 2022-11-14
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      相关资源
      最近更新 更多