2016-03-18 2 views
2

я могу объединить как data.frame тривиальным с dplyr со следующим:Р: совокупности всех уровней факторов (присутствующих и нет)

z <- data.frame(a = rnorm(20), b = rep(letters[1:4], each = 5)) 

library(dplyr) 

z %>% 
    group_by(b) %>% 
    summarise(out = n()) 

Source: local data frame [4 x 2] 

     b out 
    (fctr) (int) 
1  a  5 
2  b  5 
3  c  5 
4  d  5 

Тем не менее, иногда набор данных может отсутствовать фактор. В этом случае я хотел бы, чтобы выход был 0.

Например, типичный набор данных должен иметь 5 групп.

z$b <- factor(z$b, levels = letters[1:5]) 

Но ясно, что их нет в этот конкретный, но может быть в другом. Как я могу объединить эти данные, так что length для отсутствия factors - 0.

Желаемый результат:

Source: local data frame [4 x 2] 

     b out 
    (fctr) (int) 
1  a  5 
2  b  5 
3  c  5 
4  d  5 
5  e  0 
+0

Вы можете использовать 'tapply' как этот' tapply (г $ Ь, г $ Ь, длина) ' – Raad

+1

Я думаю, что это [открытый вопрос на github] (https://github.com/hadley/dplyr/issues/341). – JasonAizkalns

ответ

1

Один из способов приблизиться к этому - использовать complete от "tidyr". Вы должны использовать mutate первый фактор столбец «Ъ»:

library(dplyr) 
library(tidyr) 

z %>% 
    mutate(b = factor(b, letters[1:5])) %>% 
    group_by(b) %>% 
    summarise(out = n()) %>% 
    complete(b, fill = list(out = 0)) 
# Source: local data frame [5 x 2] 
# 
#  b out 
# (fctr) (dbl) 
# 1  a  5 
# 2  b  5 
# 3  c  5 
# 4  d  5 
# 5  e  0 
1

Обойти это присоединиться к таблице, содержащей все уровни:

z <- full_join(z, data.frame(b=levels(z$b)) 

Установит все недостающие строки для переменных анализа НС, которые в общий случай имел бы больше смысла, чем установка их на ноль. Вы можете изменить их на ноль, если необходимо, с z[is.na(z)] <- 0.

Смежные вопросы