Вставить строку на основе значений существующих строк в R - PullRequest
0 голосов
/ 25 апреля 2019

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

Для любого лица, когда есть разрыв между предыдущей датой выпуска и следующей датой поступления, я хотел бы добавить новую строку, которая имеет предыдущую дату выпуска в качестве даты допуска и следующую дату приема в качестве даты выпуска, поэтому нет "пробелов". Если у окончательного наблюдения человека есть дата выпуска, я также хотел бы добавить новую строку с предыдущей датой выпуска в качестве даты допуска и NA для даты выпуска.

Я думаю, что для этого может потребоваться data.table или dplyr add_row, но я не знаю как. Другие SO вопросы, которые я видел, основывались на количестве строк в группе или добавляли новые строки до / после каждой существующей строки. Если бы я мог понять, как вставить строки в правильные места, я думаю, что я мог бы использовать функции запаздывания и опережения dplyr, чтобы заполнить правильные даты.

Вот некоторые примеры данных:

myData <- data.frame(ID = c(2, 2, 2, 3, 3, 4, 5, 5, 5, 5), 
                     TERM_TYPE = c("Parole", "Prison", "Parole",
                                   "Parole", "Prison", "Parole",
                                   "Parole", "Prison", "Parole", "Prison"),
                     ADMISSION_DATE = c("2006-10-15", "2008-09-15", "2009-01-15",
                                        "2006-01-15", "2006-12-15", "2006-12-15",
                                        "2006-04-15", "2013-01-15", "2013-12-15", "2015-01-15"), 
                     RELEASE_DATE = c("2008-09-15","2009-01-15", "2010-12-15",
                                      "2006-10-15", NA, "2008-06-15",
                                      "2010-01-15", "2013-12-15", "2015-01-15", NA), 
                     stringsAsFactors = FALSE)

Я бы так выглядела:

   ID      TERM_TYPE ADMISSION_DATE RELEASE_DATE
1   2         Parole     2006-10-15   2008-09-15
2   2         Prison     2008-09-15   2009-01-15
3   2         Parole     2009-01-15   2010-12-15
4   2 Not supervised     2010-12-15         <NA>
5   3         Parole     2006-01-15   2006-10-15
6   3         Prison     2006-10-15         <NA>
7   4         Parole     2006-12-15   2008-06-15
8   4 Not supervised     2008-06-15         <NA>
9   5         Parole     2006-04-15   2010-01-15
10  5 Not supervised     2010-01-15   2013-01-15
11  5         Prison     2013-01-15   2013-12-15
12  5         Parole     2013-12-15   2015-01-15
13  5         Prison     2015-01-15         <NA>

1 Ответ

0 голосов
/ 26 апреля 2019

Могут быть более краткие способы сделать это, но я думаю, что это показывает основополагающее мышление.По сути, я объединяю три таблицы:

1) исходные данные 2) пропущенные периоды пропусков 3) периоды после известной даты выпуска

# 2 и # 3 создаются путем извлечения соответствующих строк изоригинал и модифицируя их, чтобы показать, что мы хотим.Например, # 2 находит строки с пробелами, начиная с предыдущей строки, и изменяет их так, чтобы эта строка выглядела как отсутствующий период.

# First, change dates into date formats
library(tidyverse)
library(lubridate)
myData <- myData %>%
  mutate_at(vars(contains("DATE")), ymd)

# Create table #2
myData_fill_gaps <- myData %>%
  group_by(ID) %>%
  mutate(gap_days = (ADMISSION_DATE - lag(RELEASE_DATE)) / ddays(1),
         ADM_temp = lag(RELEASE_DATE), 
         REL_temp = ADMISSION_DATE) %>%
  ungroup() %>%
  filter(gap_days > 0) %>%  # Only keep rows relating to gaps
  mutate(TERM_TYPE = "Not supervised") %>%
  select(ID, TERM_TYPE, ADMISSION_DATE = ADM_temp, RELEASE_DATE = REL_temp)

# Create table #3
myData_add_release_NA <- myData %>%
  group_by(ID) %>%
  slice(n()) %>%   # Only keep last row for each ID
  filter(!is.na(RELEASE_DATE)) %>%  # Only keep if lacking an NA in RELEASE_DATE
  mutate(TERM_TYPE = "Not supervised",
         ADMISSION_DATE = RELEASE_DATE,
         RELEASE_DATE   = NA_real_)

myData_combined <- bind_rows(
  myData,
  myData_fill_gaps,
  myData_add_release_NA
) %>%
  arrange(ID, ADMISSION_DATE)

Вывод

> myData_combined
   ID      TERM_TYPE ADMISSION_DATE RELEASE_DATE
1   2         Parole     2006-10-15   2008-09-15
2   2         Prison     2008-09-15   2009-01-15
3   2         Parole     2009-01-15   2010-12-15
4   2 Not supervised     2010-12-15         <NA>
5   3         Parole     2006-01-15   2006-10-15
6   3 Not supervised     2006-10-15   2006-12-15
7   3         Prison     2006-12-15         <NA>
8   4         Parole     2006-12-15   2008-06-15
9   4 Not supervised     2008-06-15         <NA>
10  5         Parole     2006-04-15   2010-01-15
11  5 Not supervised     2010-01-15   2013-01-15
12  5         Prison     2013-01-15   2013-12-15
13  5         Parole     2013-12-15   2015-01-15
14  5         Prison     2015-01-15         <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...