Добавление NULL, когда нет переменных данных - PullRequest
0 голосов
/ 20 февраля 2019

Ниже приведен пример DF, который иллюстрирует мою проблему.У меня проблема с группой, не имеющей значения для всех переменных, поэтому R ничего не возвращает для нее.То есть в данных ниже R возвращает:

Course   Gender  n
English1 Female  1
English1 Male    3
English2 Female  2
English2 Male    1
English2 Unknown 1
English3 Female  3
English3 Unknown 1

df1 <- data.frame("Course"=c("English1", "English1", "English1", "English1", 
                             "English2", "English2", "English2", "English2", 
                             "English3", "English3", "English3", "English3"),  
                  Gender=c("Male", "Female", "Male", "Male", "Male", "Female", 
                           "Unknown", "Female", "Female", "Female", "Female", 
                           "Unknown"),  Grade=c("A", "A", "C", "D", "D", "A", "B", 
                                                "C", "B", "D", "A", "C"))
library(dplyr)
df1 %>% group_by(Course, Gender) %>% count

Что я пытаюсь сделать, это вернуть ноль или 0, если в группе курсов нет подсчета пола.Я хотел бы, чтобы данные возвращали это (я пометил новые строки *):

Course   Gender  n
English1 Female  1
English1 Male    3
English1 Unknown 0*
English2 Female  2
English2 Male    1
English2 Unknown 1
English3 Female  3
English3 Male    0*
English3 Unknown 1

Причина, по которой мне это нужно, заключается в том, что мне нужно иметь идентичные группы (три пола для каждого курса) дляВыходной сигнал.Любая помощь с благодарностью

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

На самом деле, dplyr решение уже было решено здесь с использованием функции complete после функции count в вашем коде.Вы выбираете опцию fill = list (value = 0), чтобы заполнить недостающие строки нужными значениями, но это может быть любое другое.

Обратите внимание, сначала вам нужно ungroup, иначе вы будете делатьЭта операция выполняется один раз для каждой группы, таким образом дублируя ваши строки.

Теперь это довольно просто и более приспособлено к тому, как вы выражаете свои потребности:

    df1 %>%
     group_by(Course,Gender) %>%
     count %>% 
     ungroup() %>%
     complete(Course,Gender,fill=list(n=0))



 # A tibble: 9 x 3
  Course   Gender      n
  <fct>    <fct>   <dbl>
1 English1 Female      1
2 English1 Male        3
3 English1 Unknown     0
4 English2 Female      2
5 English2 Male        1
6 English2 Unknown     1
7 English3 Female      3
8 English3 Male        0
9 English3 Unknown     1
0 голосов
/ 21 февраля 2019

Начиная с dplyr 0.8.0, вы можете просто добавить .drop = FALSE к утверждению:

df1 %>% 
  group_by(Course, Gender, .drop = FALSE) %>% 
  count

Вывод:

# A tibble: 9 x 3
# Groups:   Course, Gender [9]
  Course   Gender      n
  <fct>    <fct>   <int>
1 English1 Female      1
2 English1 Male        3
3 English1 Unknown     0
4 English2 Female      2
5 English2 Male        1
6 English2 Unknown     1
7 English3 Female      3
8 English3 Male        0
9 English3 Unknown     1

Обратите внимание, что это можно упростить и все еще работаетесли вы просто используете count:

df1 %>% count(Course, Gender, .drop = FALSE)

# A tibble: 9 x 3
  Course   Gender      n
  <fct>    <fct>   <int>
1 English1 Female      1
2 English1 Male        3
3 English1 Unknown     0
4 English2 Female      2
5 English2 Male        1
6 English2 Unknown     1
7 English3 Female      3
8 English3 Male        0
9 English3 Unknown     1
0 голосов
/ 20 февраля 2019
data.frame(xtabs(a~Gender+Course,cbind(a=1,df1)))[c(2,1,3)]
    Course  Gender Freq
1 English1  Female    1
2 English1    Male    3
3 English1 Unknown    0
4 English2  Female    2
5 English2    Male    1
6 English2 Unknown    1
7 English3  Female    3
8 English3    Male    0
9 English3 Unknown    1

Если вы не заботитесь о заказе, то:

data.frame(xtabs(Grade~.,cbind(Grade=1,df1)))
...