在每个组中按子组汇总(&group by)

时间:2019-07-18 04:26:47

标签: r dplyr summarize

全部,我尝试获取喜欢苹果的人群和不喜欢苹果的人群中的国籍百分比(如果喜欢,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"))

如果有人能让我知道我做错了什么,将不胜感激。

2 个答案:

答案 0 :(得分: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个喜欢苹果的法国人)。

答案 1 :(得分:0)

要获得喜欢和不喜欢的比率,我们可以首先group_by CountryApple,计算每组中的行数,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