Показывать пустые группы при вырезании данных с помощью функции cut в R

#r #dataframe #dplyr

#r #фрейм данных #dplyr

Вопрос:

У меня есть фрейм данных, подобный этому

 &ender <- c("m","m","m","m","m","f","f","f","f","f")
a&e <- c(18,28,39,49,3,
         13,16,6,19,37)

df <- data.frame(&ender,a&e,strin&sAsFactors = F) 
  

Я пытаюсь создать a&eband столбец с группами по 5 от 0 до 50.

 df %&&t;%
  mutate(a&eband = cut( a&e, breaks = seq(0, 50, 5), ri&ht = FALSE)) %&&t;%
  &roup_by(&ender, a&eband) %&&t;%
  mutate(population = 1)  %&&t;%
  summarize(population = sum(population, na.rm = TRUE)) 
  

Я получаю этот вывод

  &ender a&eband population
1 f      [5,10)           1
2 f      [10,15)          1
3 f      [15,20)          2
4 f      [35,40)          1
5 m      [0,5)            1
6 m      [15,20)          1
7 m      [25,30)          1
8 m      [35,40)          1
9 m      [45,50)          1
  

Это не показывает мне группы с пустыми строками. Я хотел бы заполнить пустые строки значением population = 0.

Мой желаемый результат

    &ender a&eband population
1       f   [0,5)          0
2       f  [5,10)          1
3       f [10,15)          1
4       f [15,20)          2
5       f [20,25)          0
6       f [25,30)          0
7       f [30,35)          0
8       f [35,40)          1
9       f [40,45)          0
10      f [45,50)          0
11      m   [0,5)          1
12      m  [5,10)          0
13      m [10,15)          0
14      m [15,20)          1
15      m [20,25)          0
16      m [25,30)          1
17      m [30,35)          0
18      m [35,40)          1
19      m [40,45)          0
20      m [45,50)          1
  

Я пытался сделать это таким образом, но не совсем работает

 df %&&t;%
  mutate(a&eband = cut( a&e, breaks = seq(0, 50, 5), ri&ht = FALSE)) %&&t;%
  &roup_by(&ender, a&eband) %&&t;%
  mutate(population = 1)  %&&t;%
  summarize(population = sum(population, na.rm = TRUE)) %&&t;%
  mutate(population = coalesce(population, 0L))
  

Может ли кто-нибудь указать мне правильное направление?

Ответ №1:

Добавив tidyr , вы можете сделать:

 df %&&t;%
 mutate(a&eband = cut(a&e, breaks = seq(0, 50, 5), ri&ht = FALSE)) %&&t;%
 count(&ender, a&eband) %&&t;%
 complete(a&eband, nestin&(&ender), fill = list(n = 0)) %&&t;%
 arran&e(&ender, a&eband)

  a&eband &ender     n
   <fct&&t;   <chr&&t;  <dbl&&t;
 1 [0,5)   f          0
 2 [5,10)  f          1
 3 [10,15) f          1
 4 [15,20) f          2
 5 [20,25) f          0
 6 [25,30) f          0
 7 [30,35) f          0
 8 [35,40) f          1
 9 [40,45) f          0
10 [45,50) f          0
11 [0,5)   m          1
12 [5,10)  m          0
13 [10,15) m          0
14 [15,20) m          1
15 [20,25) m          0
16 [25,30) m          1
17 [30,35) m          0
18 [35,40) m          1
19 [40,45) m          0
20 [45,50) m          1
  

Ответ №2:

Избегая пакетов, вы можете сделать

 df$a&eband <- cut(df$a&e, breaks=seq(0, 50, 5), ri&ht=FALSE)
res <- transform(mer&e(df, expand.&rid(a&eband=levels(df$a&eband),
                                       &ender=unique(df$&ender)), all=TRUE),
                 population=ave(a&e, &ender, a&eband, FUN=function(x) 
                   sum(!is.na(x))))[-3]
res
#    &ender a&eband population
# 1       f   [0,5)          0
# 2       f  [5,10)          1
# 3       f [10,15)          1
# 4       f [15,20)          2
# 5       f [15,20)          2
# 6       f [20,25)          0
# 7       f [25,30)          0
# 8       f [30,35)          0
# 9       f [35,40)          1
# 10      f [40,45)          0
# 11      f [45,50)          0
# 12      m   [0,5)          1
# 13      m  [5,10)          0
# 14      m [10,15)          0
# 15      m [15,20)          1
# 16      m [20,25)          0
# 17      m [25,30)          1
# 18      m [30,35)          0
# 19      m [35,40)          1
# 20      m [40,45)          0
# 21      m [45,50)          1