dplyr - 获取要汇总的 group_by 的数量

dplyr - Get number of group_by to summarize

我想通过我的 group_by 变量的长度来总结。

示例数据

set.seed(112)
    df <- data.frame(
groupper = factor(sample.int(n = 12, size = 100, replace = TRUE)),
                     var = runif(100, min = 1, max = 25)
)

现在我有不同数量的因素:

table(df[,1])
1  2  3  4  5  6  7  8  9 10 11 12 
8  7  4  8  9  7 10  7 11  3 13 13 

现在我想简单地找到var在特定时间间隔内每个groupper的份额。

我的代码如下所示:

results <- df %>% group_by(groupper) %>% summarise(
var0_25 = sum(var < 25 / length(groupper)), 
var25_50 = sum(var >= 25 & var < 50) / length(groupper))
#etc...
)

但是,究竟如何才能将正确的 group_by(groupper) 长度输入到我的 summarize 中?它因每个因素而变化。

我们可以使用n()得到每组的元素数

library(dplyr)
df %>% 
    group_by(groupper) %>% 
    summarise(var0_25 = sum(var <25)/n(), 
              var25_50=sum(var >=25 & var < 50 )/n())

但是 length(.) 也可以。您的代码的问题是 var0_25 您弄乱了括号:

df %>% group_by(groupper) %>% 
    summarize(r = sum(var < 25) / length(groupper), 
              s = sum(var < 25), 
              l = length(groupper)) %>% 
    mutate(r2 = s / l)

来源:本地数据框 [12 x 5]

#    groupper r  s  l r2
# 1         1 1  8  8  1
# 2         2 1  7  7  1
# 3         3 1  4  4  1
# 4         4 1  8  8  1
# 5         5 1  9  9  1
# 6         6 1  7  7  1
# 7         7 1 10 10  1
# 8         8 1  7  7  1
# 9         9 1 11 11  1
# 10       10 1  3  3  1
# 11       11 1 13 13  1
# 12       12 1 13 13  1

我添加了列 s(总和),l(长度)只是为了证明结果确实正确。

我认为当你想计算间隔时,一个通用的解决方案是使用 cut。这段代码有点长,但只需根据您的意愿调整 cut 即可适用于任意数量的间隔。它还可以节省您手动编写列名和方程式

library(dplyr)
library(tidyr)
df %>%
  mutate(indx = cut(var, c(1, 25, 50), right = FALSE)) %>%
  group_by(groupper) %>%
  mutate(Count = n()) %>%
  group_by(groupper, indx) %>%
  summarise(Res = n()/Count[1L]) %>%
  spread(indx, Res)

# Source: local data frame [12 x 3]
# 
#    groupper    [1,25)   [25,50)
# 1         1 0.5000000 0.5000000
# 2         2 0.8571429 0.1428571
# 3         3 0.7500000 0.2500000
# 4         4 0.3750000 0.6250000
# 5         5 0.2222222 0.7777778
# 6         6 0.5714286 0.4285714
# 7         7 0.4000000 0.6000000
# 8         8 0.4285714 0.5714286
# 9         9 0.3636364 0.6363636
# 10       10 0.3333333 0.6666667
# 11       11 0.6153846 0.3846154
# 12       12 0.3076923 0.6923077