2017-02-03 4 views
1
set.seed(1) 
dat <- data.frame(ID = sample(letters,50,rep=TRUE)) 
dat %>% 
    group_by(ID) %>% 
    summarise(no_rows = length(ID)) 

У меня есть приведенный выше код, который создает случайный образец букв. Однако я могу сделать обобщенный вывод, показывающий все уровни подсчета, даже когда есть нуль.Группа R по показателю количества всех уровней факторов, даже если нуль dplyr

Когда я запускаю вышеуказанный код, иногда я получаю 20 строк, а иногда получаю 25 и т. Д. Я хочу, чтобы это возвращало 26 строк каждый раз.

ответ

1

Мы можем преобразовать 'ID' в factor с levels определены и просто использовать table

table(factor(dat$ID, levels = letters)) 

Или, используя то же самое с tidyverse

library(tidyverse) 
dat %>% 
    mutate(ID=factor(ID, levels = letters)) %>% 
    complete(ID) %>% 
    group_by(ID) %>% 
    summarise(no_rows = n()) 
+0

Спасибо, я использовал это. Мне было интересно, возможно ли это сделать и для дат. Например, столбец «ID» был месяцами года, можно ли использовать dplyr – Chinwobble

+0

@Chinwobble Да, это возможно. Можете ли вы предоставить более подробную информацию о том, как представлены месяцы. Если это 1:12, тогда 'table (factor (dat $ ID, levels = 1:12))' – akrun

+0

Это правильное время и время от SQL Server. Таким образом, они находятся в формате формата даты даты с 'yyyy-MM-dd' – Chinwobble

1

Это также будет работать:

set.seed(1) 
dat <- data.frame(ID = sample(letters,50,rep=TRUE)) 
levels(dat$ID) <- letters 
as.data.frame(dat %>% xtabs(formula = ~ ID)) 
# ID Freq 
#1 a 2 
#2 b 1 
#3 c 1 
#4 d 1 
#5 e 2 
#6 f 3 
#7 g 2 
#8 h 1 
#9 i 4 
#10 j 2 
#11 k 4 
#12 l 1 
#13 m 2 
#14 n 1 
#15 o 3 
#16 p 3 
#17 q 3 
#18 r 1 
#19 s 5 
#20 t 2 
#21 u 1 
#22 v 2 
#23 w 2 
#24 x 1 
#25 y 0 
#26 z 0