【问题标题】:Why are both of these values showing up as 100%?为什么这两个值都显示为 100%?
【发布时间】:2020-08-08 23:27:20
【问题描述】:

我正在尝试制作饼图,第一步是计算每个部分的实际百分比份额。我认为我应该能够使用mutate,但它给了我 100% 的全面支持:

 starwars %>%
  group_by(gender) %>%
  count() %>%
  mutate(percent = n / sum(n) * 100) 

我希望看到计算出的百分比,如下所示:

gender          n     percent
female          19      22
hermaphrodite   1       1
male            62      71
none            2       2
NA              3       3 

但每一行似乎都是 100%:

gender          n     percent
female          19      100
hermaphrodite   1       100
male            62      100
none            2       100
NA              3       100

我需要在此处更改什么以便获得 n 总和的百分比?

【问题讨论】:

  • 试试base R with(starwars, prop.table(table(gender, useNA="ifany"))).
  • 我想通了:我想要的是starwars %>% count(gender) %>% mutate(percent = n / sum(n) * 100)
  • 不过,我很想了解其中的区别。

标签: r pie-chart dplyr


【解决方案1】:

您需要先取消分组,否则您正在执行 sum(n) 分组。

starwars %>%
  group_by(gender) %>%
  count() %>% ungroup() %>%
  mutate(percent = n / sum(n) * 100) 

如 cmets 中所述,另一种结构是:

starwars %>% 
  group_by(gender) %>% 
  summarise(n=n(), percent = n / nrow(.) * 100)  

严格来说,mutate 会将百分比添加到原始 tibble 的每一行。 summarise 给出所要求的摘要。

【讨论】:

  • 严格来说,mutate 将百分比添加到原始 tibble 的每一行。 summarise 给出了他们要求的摘要。但是您正确地确定了他们问题的根本原因,因此投了赞成票。 starwars %>% group_by(gender) %>% summarise(n=n(), percent = n / nrow(.) * 100) 消除了对 ungroup 的需要,是一种获得请求结果的紧凑方式。
  • @Limey 我使用了 OP 提供的代码并尝试对其进行修改,以使其产生所需的结果。同意您的代码版本更加简洁明了。
猜你喜欢
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多