R сохранить группы нулевой длины в таблице частот - PullRequest
2 голосов
/ 25 января 2020

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

gender<-c('male' ,'male', 'male', 'male','male',
          'female', 'female', 'female','female', 'female' ,'female', 'female', 'female','female')   
clothes<-c('hat', 'hat', 'hat', 'shirt', 'shirt', 'hat', 'hat', 'hat', 'shirt', 'shirt', 'shirt', 'dress', 'dress', 'dress')
color<-c('blue', 'blue', 'green', 'blue', 'brown', 'green', 'brown', 'brown', 'blue', 'green', 'green', 'blue', 'green', 'green')
x<-data.frame(gender, clothes, color)

Мне нужно составить таблицу частот пола по одежде по цвету, с NA только для отсутствующих цветов. Оба пола и все уровни одежды должны быть связаны с 3 уровнями цвета. Тем не менее, для одного гендерного уровня мне не хватает одежды уровня «платье», и я не хочу, чтобы он был заполнен национальными организациями, я хочу, чтобы он вообще был опущен.

Я пытался подсчитать:

x$color<-as.factor(x$color)
x_agg<-x%>%
  group_by(gender, clothes, color)%>%
  tally()

И это вообще не достигает цели; Я не получаю NA для пропущенных уровней каких-либо переменных.

Когда я применяю следующий код:

library(tidyverse)
x_agg<-x%>%
  group_by(gender, clothes, color)%>%
  summarise(cnt=n())%>%
  ungroup() %>%
  complete(gender, clothes, color,
           fill = list(N = 0))

Я получаю NA для мужчины - платье - всех цветов. Но то, что я хочу, это NA только для последней переменной группировки (цвета), а не для одежды и цветов. Вот так:

gender<-c('male' ,'male', 'male', 'male','male','male',
      'female', 'female', 'female','female', 'female' ,'female', 'female', 'female','female')   
clothes<-c('hat', 'hat', 'hat', 'shirt', 'shirt', 'shirt', 
       'hat', 'hat', 'hat', 'shirt', 'shirt', 'shirt', 'dress', 'dress', 'dress')
color<-c('blue', 'green', 'brown', 
     'blue', 'green', 'brown',
     'blue', 'green', 'brown',
     'blue', 'green', 'brown',
     'blue', 'green', 'brown')
cnt<-c(2, 1, NA, 1, NA, 1, NA, 1, 2, 1, 2, NA, 1, 2, NA)     
x_agg1<-data.frame(gender, clothes, color, cnt)     

Или вот картинка: enter image description here

Я думаю, что перепробовал все, что мог придумать. Были предложения по переполнению стека, но все они относились либо к группированию по одной переменной, либо к заполнению NA для всех уровней каждой отдельной переменной группировки. Но не ясно, что делать, если необходимо заполнить / сохранить только уровни одной переменной? Есть предложения?

1 Ответ

2 голосов
/ 25 января 2020

Вместо group_by/summarise мы также можем сделать count

library(dplyr)
library(tidyr)
x %>%
     count(gender, clothes, color) %>%
     group_by(gender, clothes) %>%
     complete(color)
# A tibble: 15 x 4
# Groups:   gender, clothes [6]
#   gender clothes color     n
#   <fct>  <fct>   <fct> <int>
# 1 female dress   blue      1
# 2 female dress   brown    NA
# 3 female dress   green     2
# 4 female hat     blue     NA
# 5 female hat     brown     2
# 6 female hat     green     1
# 7 female shirt   blue      1
# 8 female shirt   brown    NA
# 9 female shirt   green     2
#10 male   hat     blue      2
#11 male   hat     brown    NA
#12 male   hat     green     1
#13 male   shirt   blue      1
#14 male   shirt   brown     1
#15 male   shirt   green    NA
...