【问题标题】:Computing Percentages of each Subgroup计算每个子组的百分比
【发布时间】:2019-06-11 10:34:59
【问题描述】:

这个问题之前已经回答过,但解决方案不适用于我的特定情况。

col1   |   col2
 A     |    0
 B     |    1
 A     |    0
 A     |    1
 B     |    0

我基本上是在找这个:

col1   |   col2   |   Percentage
 A     |    0     |      0.67
 A     |    1     |      0.33
 B     |    0     |      0.50
 B     |    1     |      0.50

两列都是因子。以下解决方案是我在其他线程中不断发现的:

df %>% group_by(col1, col2) %>% summarise(n=n()) %>% mutate(freq = n / sum(n))
or something along those lines.

事实上,group_by 似乎并没有真正做任何事情。它没有给我一个“n”或“freq”列。不知道我做错了什么。是因为我在处理因素吗?此外,如果不明显,列中提供的值是假设值。

【问题讨论】:

  • 我不明白这个问题。您的代码提供与预期完全相同的输出
  • 得到以下错误:错误:n() 只能在数据上下文中调用调用rlang::last_error() 以查看回溯
  • 你能检查一下你的dplyr 版本吗?我在R 3.6.0上使用了packageVersion('dplyr')# [1] ‘0.8.1’
  • 您能否尝试重新进行会话,因为我无法重现您的问题
  • 好的,我会记住的。感谢您的帮助。

标签: r dplyr


【解决方案1】:

一种选择是在按“col1”分组后获取频率计数,然后将“col2”也作为分组列,将该频率除以已经创建的频率

library(dplyr)
df %>% 
   group_by(col1) %>%
   mutate(n = n()) %>%
   group_by(col2, add = TRUE) %>% 
   summarise(freq = n()/n[1])
# A tibble: 4 x 3
# Groups:   col1 [2]
#  col1   col2  freq
#  <chr> <int> <dbl>
#1 A         0 0.667
#2 A         1 0.333
#3 B         0 0.5  
#4 B         1 0.5  

数据

df <- structure(list(col1 = c("A", "B", "A", "A", "B"), col2 = c(0L, 
1L, 0L, 1L, 0L)), class = "data.frame", row.names = c(NA, -5L
))

【讨论】:

  • 就像我说的,group_by 似乎出于某种原因没有做任何事情,所以它在第二次管道操作后中断,因为没有“n”。
  • @user10939484 我在帖子中显示了数据,以及预期(与您的预期相符)
  • @user10939484 你是否偶然加载了plyr 库和dplyr。在这种情况下,它可以屏蔽summarise/mutate。所以你可能需要显式添加%&gt;% dplyr::mutate(n = n()) %&gt;% ... %&gt;% dplyr::summarise(freq = n()/n[1])
  • plyr 也已加载,因为我已加载 ggplot。我尝试了您的建议,但没有成功。所以我使用了你的数据,同样的事情发生了。它不是分组和输出计数。有什么想法吗?
  • @user10939484 您能否尝试仅加载 dplyr 的新会话,因为我无法重现该行为。甚至您的代码也给出了正确的输出
猜你喜欢
  • 2017-11-12
  • 2021-03-18
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多