Как создать накопительную таблицу отсева из необработанных данных - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь изменить решение, опубликованное здесь Создать таблицу коэффициентов отсева когорт из необработанных данных

Я хотел бы создать таблицу коэффициентов отсева CUMULATIVE, используя эти данные.

DT<-data.table(
id =c (1,2,3,4,5,6,7,8,9,10,
     11,12,13,14,15,16,17,18,19,20,
     21,22,23,24,25,26,27,28,29,30,31,32,33,34,35),
year =c (2014,2014,2014,2014,2014,2014,2014,2014,2014,2014,
       2015,2015,2015,2015,2015,2015,2015,2015,2015,2015,
   2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016,2016),
cohort =c(1,1,1,1,1,1,1,1,1,1,
        2,2,2,1,1,2,1,2,1,2,
        1,1,3,3,3,2,2,2,2,3,3,3,3,3,3))

До сих пор я был в состоянии добраться до этой точки

     library(tidyverse)

DT %>% 
  group_by(year) %>% 
  count(cohort) %>% 
  ungroup() %>% 
  spread(year, n) %>% 
  mutate(y2014_2015_dropouts = (`2014` - `2015`),
         y2015_2016_dropouts =  (`2015` - `2016`)) %>% 
  mutate(y2014_2015_cumulative =y2014_2015_dropouts/`2014`,
         y2015_2016_cumulative =y2015_2016_dropouts/`2014`+y2014_2015_cumulative)%>%


  replace_na(list(y2014_2015_dropouts = 0.0,
                  y2015_2016_dropouts = 0.0)) %>% 
  select(cohort, y2014_2015_dropouts, y2015_2016_dropouts, y2014_2015_cumulative,y2015_2016_cumulative )

Таблица совокупного отсева отражает долю учащихся в классе, которые бросили школу в разные годы.

     # A tibble: 3 x 5
  cohort y2014_2015_dropouts y2015_2016_dropouts y2014_2015_cumulative y2015_2016_cumulative
   <dbl>               <dbl>               <dbl>                 <dbl>                 <dbl>
1      1                   6                   2                   0.6                   0.8
2      2                   0                   2                  NA                    NA  
3      3                   0                   0                  NA                    NA  
>  

Последние два столбца таблицы показывают, что к концу 2014–2015 годов 60% учащихся 1-й группы бросили учебу;и к концу 2015-2016 гг. 80% учащихся 1 группы бросили учебу.

Я бы хотел рассчитать то же самое для когорт 2 и 3, но я не знаю, как это сделать.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Вот альтернативное data.table решение, позволяющее упорядочить ваши данные так, чтобы мне было легче с ними обращаться.Используя ваши DT входные данные:

Организация и упорядочение по группам и годам:

DT2 <- DT[, .N, list(cohort, year)][order(cohort, year)]

Назначьте диапазон года:

DT2[, year := paste(lag(year), year, sep = "_"),]

Получите отсев в год

DT2[, dropouts := ifelse(!is.na(lag(N)), lag(N) - N, 0), , cohort, ]

Получите совокупную сумму, выпавшую каждый год на группу:

DT2[, cumul := cumsum(dropouts) / max(N), cohort]

Выход:

> DT2
   cohort      year  N dropouts     cumul
1:      1   NA_2014 10        0 0.0000000
2:      1 2014_2015  4        6 0.6000000
3:      1 2015_2016  2        2 0.8000000
4:      2 2016_2015  6        0 0.0000000
5:      2 2015_2016  4        2 0.3333333
6:      3 2016_2016  9        0 0.0000000
0 голосов
/ 06 июня 2018

Поскольку вы распределяете данные по годам в начале канала, а в столбцах 2014 есть значения NA для всего, что относится к когорте 2, вам необходимо объединить знаменатель в ваших вычислениях для y2015_2016_cumulative.Если вы замените определение для этой переменной с текущего

y2015_2016_cumulative =y2015_2016_dropouts/`2014`+y2014_2015_cumulative

на

y2015_2016_cumulative =y2015_2016_dropouts/coalesce(`2014`, `2015`) +
coalesce(y2014_2015_cumulative, 0)

, то все будет хорошо.Функция coalesce пытается первый аргумент, но вводит второй аргумент, если первый равен NA.При этом данный метод не очень масштабируем.Вы должны будете добавить дополнительные операторы объединения для каждого добавленного года.Если вы сохраняете свои данные в чистом формате, вы можете сохранить текущий список на уровне годовой когорты, используя

DT %>% 
group_by(year) %>% 
count(cohort) %>% 
ungroup() %>% 
group_by(cohort) %>% 
mutate(dropouts = lag(n) - n,
       dropout_rate = dropouts / max(n)) %>% 
replace_na(list(dropouts = 0, n = 0, dropout_rate = 0)) %>% 
mutate(cumulative_dropouts = cumsum(dropouts),
       cumulative_dropout_rate = cumulative_dropouts / max(n))
...