计算某个组的相对频率

use*_*386 2 r dplyr

我有一个分类变量的数据框,我已经分成了几组,我得到了每组的计数.

My original data nyD looks like:

Source: local data frame [7 x 3]
Groups: v1, v2, v3

  v1    v2   v3
1  a  plus  yes
2  a  plus  yes
3  a minus   no
4  b minus  yes
5  b     x  yes
6  c     x notk
7  c     x notk

I performed the following operations using dplyr:

ny1 <- nyD %>% group_by(v1,v2,v3)%>%
           summarise(count=n()) %>%
           mutate(prop = count/sum(count))


My data "ny1" looks like:

Source: local data frame [5 x 5]
Groups: v1, v2

  v1    v2   v3 count prop
1  a minus   no     1    1
2  a  plus  yes     2    1
3  b minus  yes     1    1
4  b     x  yes     1    1
5  c     x notk     2    1
Run Code Online (Sandbox Code Playgroud)

我想计算与prop变量中的V1组相关的相对频率.prop变量应该是相应的计数除以"V1组的计数总和".V1组总共有3"a",2"b"和1"c".也就是说,ny1 $ prop [1] < - 1/3,ny1 $ prop [2] < - 2/3 ....使用count/sum(count)的mutate操作不正确.我需要指定总和应仅归入V1组.有没有办法使用dplyr实现这一目标?

Dav*_*urg 6

您可以一步完成这一切(从原始数据开始nyD,无需创建ny1).那是因为当你运行mutate之后summarise,默认dplyr会丢弃一个聚合级别(v2)(当然是我最喜欢的功能dplyr)并且只会聚合v1

nyD %>% 
   group_by(v1, v2) %>%
   summarise(count = n()) %>%
   mutate(prop = count/sum(count))

# Source: local data frame [5 x 4]
# Groups: v1
# 
#   v1    v2 count      prop
# 1  a minus     1 0.3333333
# 2  a  plus     2 0.6666667
# 3  b minus     1 0.5000000
# 4  b     x     1 0.5000000
# 5  c     x     2 1.0000000
Run Code Online (Sandbox Code Playgroud)

或使用较短的版本count(感谢@beginneR)

df %>% 
  count(v1, v2) %>% 
  mutate(prop = n/sum(n))
Run Code Online (Sandbox Code Playgroud)

  • 或者更短:`count(df,v1,v2)%>%mutate(prop = n/sum(n))` (2认同)