Взятие таблицы и стратификация по выбранной переменной - PullRequest
1 голос
/ 10 октября 2019

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

Это то, что я пробовал до сих пор, предоставляя мне следующий вывод:

library(tidyverse)
ucb %>%
    group_by(Admit, Gender, n, Dept) %>%
    spread(key = Admit, value = n) %>%
    mutate(Prop_Admitted = Admitted / (Admitted + Rejected), 
           Prop_Rejected = Rejected / (Admitted + Rejected)) %>%
    head(n = 20)

# Output
Gender  Dept    Admitted    Rejected    Prop_Admitted   Prop_Rejected
<chr>   <chr>   <dbl>   <dbl>   <dbl>   <dbl>
Female  A   89  19  0.82407407  0.1759259
Female  B   17  8   0.68000000  0.3200000
Female  C   202 391 0.34064081  0.6593592
Female  D   131 244 0.34933333  0.6506667
Female  E   94  299 0.23918575  0.7608142
Female  F   24  317 0.07038123  0.9296188
Male    A   512 313 0.62060606  0.3793939
Male    B   353 207 0.63035714  0.3696429
Male    C   120 205 0.36923077  0.6307692
Male    D   138 279 0.33093525  0.6690647
Male    E   53  138 0.27748691  0.7225131
Male    F   22  351 0.05898123  0.9410188

Это таблица, к которой я стремлюсь в итоге, со всеми соответствующими значениями, заполненнымив, конечно.

Dept    Female_Admitted Female_Rejected Male_Admitted   Male_Rejected   Male_Proportion_Admitted    Female_Proportion_Admitted
A   
B   
C   
D   
E   
F   

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

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Я не уверен с тидиверсом, но с data.table довольно прямолинейно. Надеюсь, это поможет:

library(data.table)
dcast(dt, dept ~ gender, sep = "_", value.var = names(dt)[3:6])

Используемые данные:

dt <- data.table(gender = c(rep("Female", 6), rep("Male", 6)), 
                 dept = rep(LETTERS[1:6], 2), 
                 Admitted = sample(1:100, 6, FALSE), 
                 Rejected = sample(1:100, 6), 
                 Prop_admitted = runif(6), prop_rejected = runif(6))
1 голос
/ 10 октября 2019

Вы можете использовать pivot_wider из нового tidyr, который может принимать несколько аргументов values_from

tidyr::pivot_wider(df, names_from = Gender, 
                       values_from = matches("Admitted$|Rejected"))

# A tibble: 6 x 9
#  Dept  Admitted_Female Admitted_Male Rejected_Female Rejected_Male
#  <fct>           <int>         <int>           <int>         <int>
#1 A                  89           512              19           313
#2 B                  17           353               8           207
#3 C                 202           120             391           205
#4 D                 131           138             244           279
#5 E                  94            53             299           138
#6 F                  24            22             317           351
# … with 4 more variables: Prop_Admitted_Female <dbl>,Prop_Admitted_Male <dbl>,
#   Prop_Rejected_Female <dbl>,Prop_Rejected_Male <dbl>

Для более старой версии tidyr мы можем сделать

df %>%
   gather(key, value, -Gender, -Dept) %>%
   unite(key, Gender, key) %>%
   spread(key, value)

, где df равно

df <- ucb %>%
        group_by(Admit, Gender, n, Dept) %>%
        spread(key = Admit, value = n) %>%
        mutate(Prop_Admitted = Admitted / (Admitted + Rejected), 
               Prop_Rejected = Rejected / (Admitted + Rejected))
...