Даты записи во вложенных данных в непрерывный длинный файл в течение l oop в R - PullRequest
1 голос
/ 21 января 2020

Я немного борюсь с логикой c для перекодирования вложенных данных в длинный «непрерывный» формат, основанный на датах в R

Ниже приведен фиктивный пример моих данных. У меня есть три набора дат: время начала и окончания для участника, который хранится в длинном формате, и затем начало другого инцидента, который хранится в виде широких данных.

enter image description here


  GC_ID   HMIS_Start   HMIS_Stop   CPS Start   CPS Start 2   CPS Start 3  
 ------- ------------ ----------- ----------- ------------- ------------- 
      1   1/10/14      1/20/14     1/15/14     6/2/14        NA           
      1   4/10/14      5/30/14     1/15/14     6/2/14        NA           
      1   12/1/14      12/2/14     1/15/14     6/2/14        NA           
      1   1/1/15       2/28/15     1/15/14     6/2/14        NA           
      2   8/13/13      8/17/14     NA          NA            NA           
      3   5/1/15       5/2/15      1/16/13     6/26/14       7/27/15      
      3   6/4/16       7/10/16     1/16/13     6/26/14       7/27/15      
      4   10/15/13     10/25/13    2/18/15     NA            NA           
      4   12/25/13     1/18/14     2/18/15     NA            NA           
      4   2/8/15       7/20/15     2/18/15     NA            NA           

Моя цель - создать две длинные непрерывные переменные, которые go вместе с каждым месяцем с августа 2013 года по декабрь 2015 года. из двух переменных я хотел бы указать 1 для каждого месяца, для которого целевой месяц находится в пределах времени HMIS_start и HMIS_stop для участника И имеет как минимум одну дату начала CPS в этом месяце. Вторая переменная будет делать то же самое, но это произойдет, если дата начала CPS произошла через месяц после даты остановки HMIS.

Таким образом, данные участника 1 могут выглядеть следующим образом:

enter image description here

Я предполагаю, что мне нужно создать пустой набор данных с переменной ID а затем переменная месяц / год. Затем я использовал бы для l oop для каждого идентификатора, чтобы выполнить оператор if_then, сравнивающий, если месяц больше, чем начало HMIS, и меньше, чем останов HMIS, И если запуск CPS также находится в этом месяце.

Я в основном просто пытаюсь понять, как создать этот процесс и использовать логическую форму для l oop, учитывая, что в файле уже есть длинные данные и несколько строк длинных данных на участника, которые необходимо сравнить с все возможные даты начала CPS

Любые мысли или советы по кодам о том, как справиться с этим?

1 Ответ

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

Я не уверен, как вы пришли к своим ответам, и я обновлю этот код, как только он будет предоставлен. Но я использовал для этого library(tidyverse) и library(lubridate):

dat <- data.frame(GC_ID = c(1,1,1,1,2,3,3,4,4,4), 
                  HMIS_Start = c("1/10/14", "4/10/14", "12/1/14", "1/1/15", "8/13/13", "5/1/15", "6/4/16", "10/15/13", "12/25/13","2/8/15"), HMIS_Stop = c("1/20/14", "5/30/14", "12/2/14", "2/28/15", "8/17/14", "5/2/15", "7/10/16", "10/25/13", "1/18/14", "7/20/15"), CPS_Start = c("1/15/14","1/15/14","1/15/14","1/15/14",NA, "1/16/13", "1/16/13", "2/18/15", "2/18/15", "2/18/15"), CPS_Start_2 = c("6/2/15", "6/2/15", "6/2/15", "6/2/15", NA, "6/26/14", "6/26/14", NA, NA, NA), CPS_Start_3 = c(NA,NA,NA,NA,NA,"7/27/15", "7/27/15", NA,NA,NA))

dats <- dat %>% 
        mutate_if(is.factor, as.character) %>% 
        mutate_if(is.character, ~as.Date(., format = "%m/%d/%y")) %>%
        gather(Var, Dates, -GC_ID, -HMIS_Start, -HMIS_Stop) %>%
        filter(!is.na(Dates)) %>%
        mutate(HMIS_CPS_SAME = if_else(month(HMIS_Start) == month(HMIS_Stop) &
                                       year(HMIS_Start)  == year(HMIS_Stop)  &
                                       month(HMIS_Start) == month(Dates)     &
                                       year(HMIS_Start)  == year(Dates), 1, 0 ),
               CPS_After     = if_else(month(HMIS_Stop) + 1 == month(Dates) &
                                       year(HMIS_Stop) == year(Dates), 1,0 ),
               Months        = month(HMIS_Start),
               Years         = year(HMIS_Start)) %>%
        arrange(GC_ID, HMIS_Start, Dates) %>%
        group_by(GC_ID, Months, Years) %>%
        summarise(HMIS_CPS_SAME = max(HMIS_CPS_SAME),
                  CPS_After     = max(CPS_After)) %>% 
        ungroup()

full_dat <- merge(data.frame(GC_ID = unique(dat$GC_ID)), data.frame(Dates = seq.Date(as.Date("2013-08-01"), as.Date("2015-12-01"), by = "month"))) %>%
            mutate(Months = month(Dates), Years = year(Dates)) %>% 
            left_join(dats, by = c("GC_ID", "Months", "Years")) %>%
            mutate_if(is.numeric , replace_na, replace = 0)

Сначала я создал данные в форматах R и R. Затем я преобразовал данные в формат даты для 5 столбцов, которые вы упомянули. Я сделал данные долго, чтобы сделать указанные сравнения, затем нашел максимум для каждого GC_ID, Months, Years. Затем я использовал декартово объединение для каждой даты и GC_ID и получил месяцы и годы от них и присоединил наши dats к full_dat на GC_ID, Months, Years. Последний mutate_if должен преобразовать все значения NA в 0. НЕТ Цикл необходим! :-)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...