dplyr - 获取要汇总的group_by数

时间:2015-08-20 11:03:31

标签: r dplyr

我想传递我的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 

现在,我想在一定的时间间隔内找到每个vargroupper的份额。

我的代码如下所示:

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长度?它因每个因素而变化。

3 个答案:

答案 0 :(得分:3)

我们可以使用n()来获取每组的元素数量

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

答案 1 :(得分:3)

我认为,当您想要计算间隔时,通用解决方案是使用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

答案 2 :(得分:1)

但是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(长度)只是为了表明结果确实正确。

相关问题