按组别汇总的比例

Summary of proportions by group

用来按子组计算比例的最佳 tool/package 是什么?我想我可以尝试这样的事情:

data(mtcars)
library(plyr)
ddply(mtcars, .(cyl), transform, Pct = gear/length(gear))

但输出不是我想要的,因为我想要行数等于 cyl 的东西。即使将其更改为 summarise 我仍然会遇到同样的问题。

我对其他软件包持开放态度,但我认为 plyr 最好,因为我最终想围绕它构建一个函数。有什么想法吗?

如果能帮助解决像这样的基本问题,我将不胜感激。

library(dplyr)

mtcars %>%
  count(cyl, gear) %>%
  mutate(prop = prop.table(n))

请参见 ?count,基本上,countsummarisen() 的包装器,但它会为您进行分组。看看 mtcars %>% count(cyl, gear) 的输出。然后,我们添加一个带有 mutate 的附加变量,名为 prop,这是对我们在 count(cyl, gear) 之后创建的 n 变量调用 prop.table() 的结果.

您可以使用 count()SE 版本将其创建为函数,即 count_()。查看dplyr包中的vignette for Non-Standard Evaluation

这是一个很好的 github gist 解决许多交叉表变体与 dplyr 和其他包。

获取组内频率:

library(dplyr)
mtcars %>% count(cyl, gear) %>% mutate(Freq = n/sum(n))
# Source: local data frame [8 x 4]
# Groups: cyl [3]
# 
#     cyl  gear     n       Freq
#   (dbl) (dbl) (int)      (dbl)
# 1     4     3     1 0.09090909
# 2     4     4     8 0.72727273
# 3     4     5     2 0.18181818
# 4     6     3     2 0.28571429
# 5     6     4     4 0.57142857
# 6     6     5     1 0.14285714
# 7     8     3    12 0.85714286
# 8     8     5     2 0.14285714

或等价地,

mtcars %>% group_by(cyl, gear) %>% summarise(n = n()) %>% mutate(Freq = n/sum(n))

注意每个阶段的分组情况,否则你的号码会掉线