2015-08-20 4 views
3

Я хотел бы передать длину моей переменной group_by, чтобы суммировать.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 

Теперь я хотел бы просто найти долю 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? Он изменяется для каждого фактора.

+0

aaaaaahhhhh, спасибо! – NoThanks

ответ

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 
3

Мы можем использовать n(), чтобы получить число элементов в группе

library(dplyr) 
df %>% 
    group_by(groupper) %>% 
    summarise(var0_25 = sum(var <25)/n(), 
       var25_50=sum(var >=25 & var < 50)/n()) 
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 х 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 (для длины), чтобы показать, что результаты действительно верны.