【问题标题】:summarize(&group by) by subgroup in each group按每个组中的子组汇总(&group by)
【发布时间】:2019-11-26 22:51:55
【问题描述】:

所有,我试图获得喜欢苹果的人群和不喜欢苹果的人群中的国籍百分比(如果这个人喜欢,Apple==1,如果不喜欢,Apple==0 )。我使用此代码,但百分比不是我想要的:

sample %>%
group_by(Apple,Country) %>%
dplyr::summarise(count=n())%>%
mutate(pct_gender=count/sum(count))

我从这段代码中得到了国籍+苹果在所有观察中的百分比。 (例如,在所有 31 次观察中,有 18 人喜欢苹果。在喜欢苹果的 18 人中,有 7 人来自法国。所以我想得到 7/18=38.8%,但我得到的结果是 7/31=22.6% )

这是我使用的数据:

structure(list(id = 1:30, Country = c("USA", "USA", "USA", "USA", 
"USA", "USA", "USA", "USA", "Germany", "Germany", "Germany", 
"Germany", "Germany", "Germany", "UK", "UK", "UK", "UK", "UK", 
"UK", "UK", "UK", "UK", "UK", "France", "France", "France", "France", 
"France", "France"), Apple = c(1L, 1L, 1L, 0L, 0L, 1L, 0L, 1L, 
1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 
1L, 1L, 1L, 1L, 1L, 1L), Banana = c(1L, 1L, 0L, 1L, 1L, 0L, 0L, 
1L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 
1L, 1L, 0L, 0L, 0L, 1L, 1L), Orange = c(0L, 0L, 0L, 0L, 0L, 1L, 
1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 
1L, 0L, 0L, 1L, 1L, 0L, 0L, 1L), Jackfruit = c(0L, 0L, 1L, 1L, 
0L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 1L, 0L, 0L, 1L, 
1L, 0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 1L)), row.names = c(NA, -30L
), class = c("tbl_df", "tbl", "data.frame"))

如果有人能告诉我我做错了什么,将不胜感激。

【问题讨论】:

    标签: r dplyr summarize


    【解决方案1】:

    我同意@Ronak Shah,这在基础上比任何其他软件包都容易:

    使用table(如Ronak 建议的那样),但使用prop.table

    prop.table(table(df$Country, df$Apple), margin = 2)
    

    产生:

                      0         1
      France  0.0000000 0.3529412
      Germany 0.3076923 0.1176471
      UK      0.4615385 0.2352941
      USA     0.2307692 0.2941176
    

    请注意,您不应该期望法国有 38.8% - 喜欢(在您的玩具数据中,在 17 个人中,只有 6 个法国人喜欢苹果)。

    【讨论】:

      【解决方案2】:

      要得到喜欢和不喜欢的比率,我们可以先group_byCountryApple,统计每组的行数,spread它是宽格式,然后计算比率。

      sample %>%
        group_by(Country, Apple) %>%
        summarise(perc = n()) %>%
        mutate(Apple = c("dislike", "like")[Apple + 1])  %>%
        tidyr::spread(Apple, perc, fill = 0) %>%
        ungroup() %>%
        mutate_at(vars(dislike, like), ~./sum(.))
      
      # A tibble: 4 x 3
      #  Country dislike  like
      #  <chr>     <dbl> <dbl>
      #1 France    0     0.353
      #2 Germany   0.308 0.118
      #3 UK        0.462 0.235
      #4 USA       0.231 0.294
      

      在基础 R 中,使用 table 会更简单

      dat <-table(sample$Country, sample$Apple)
      t(t(dat)/colSums(dat))
      
      
      #                  0         1
      #  France  0.0000000 0.3529412
      #  Germany 0.3076923 0.1176471
      #  UK      0.4615385 0.2352941
      #  USA     0.2307692 0.2941176
      

      【讨论】:

      • 感谢 Ronak,但我收到一条错误消息:“计数错误 (., Country) : object 'Country' not found”
      • @iceylovedata 我正在使用您提供的sample 数据,对我来说效果很好。您是否使用相同的数据?里面有Country 列吗?
      • 是的,我使用的是相同的数据。国家是一列。
      • @iceylovedata 好的,我认为count 被其他包屏蔽一定是个问题。您可以明确指定dplyr::count。您也可以尝试更新的代码吗?我认为这就是您要求分别获得“Apple”的喜欢和不喜欢的内容。
      • 嗨,Ronak,非常感谢!这正是我想要的。
      猜你喜欢
      • 2015-04-03
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      相关资源
      最近更新 更多