R dplyr: подсчет для создания данных панели - PullRequest
0 голосов
/ 18 марта 2020

У меня есть следующий фрейм данных:

D <- data.frame("Id" = c("a","b","c","d","e","f","g"), "Group" = c("1","1","1","2","2","2","2"),"Time" = c("1","1","2","1","2","3","3"))

  Id Group Time
1  a     1    1
2  b     1    1
3  c     1    2
4  d     2    1
5  e     2    2
6  f     2    3
7  g     2    3

Я хочу посчитать количество людей по периоду и времени, сохраняя структуру цилиндра. Классический способ сделать это использует dplyr

D %>% group_by(Group,Time) %>% tally()
  Group Time      n
  <fct> <fct> <int>
1 1     1         2
2 1     2         1
3 2     1         1
4 2     2         1
5 2     3         2

, но структура не сбалансирована: время 3 здесь не отображается для группы 1, но я бы хотел, чтобы оно ассоциировалось с 0, например так:

  Group Time      n
  <fct> <fct> <int>
1 1     1         2
2 1     2         1
3 1     3         0
4 2     1         1
5 2     2         1
6 2     3         2

Есть ли способ сбалансировать результаты после group_by? Кто-нибудь сталкивался с чем-то подобным? Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 18 марта 2020

Поскольку Time является переменной фактора, мы можем использовать count с .drop = FALSE, так как по умолчанию count отбрасывает наблюдение с 0 счетами.

library(dplyr)
D %>% count(Group, Time, .drop = FALSE)

#  Group Time      n
#  <fct> <fct> <int>
#1 1     1         2
#2 1     2         1
#3 1     3         0
#4 2     1         1
#5 2     2         1
#6 2     3         2

Мы можем использовать тот же метод, используя tally.

D %>% group_by(Group,Time, .drop = FALSE) %>% tally()

Или с complete

D %>%  count(Group, Time) %>% tidyr::complete(Group, Time, fill = list(n = 0))
1 голос
/ 18 марта 2020

Небольшая альтернатива ответу Ронак Шаха:

library(tidyr)
library(dplyr)

D <- data.frame("Id" = c("a","b","c","d","e","f","g"), "Group" = c("1","1","1","2","2","2","2"),"Time" = c("1","1","2","1","2","3","3"))

D %>% 
  group_by(Group,Time) %>% 
  tally() %>% 
  ungroup() %>%
  complete(Group, Time)
0 голосов
/ 18 марта 2020

В base R, мы можем использовать table

as.data.frame(table(D[-1])) 
...