Как указать значение перед конкретным полем - PullRequest
1 голос
/ 23 сентября 2019

Ниже приведен набор данных с подмножеством, мне было интересно, как мне поступить с каждым набором идентификаторов и отсортировать его по самым ранним или самым поздним датам, создать новый столбец, в котором будет указана строка перед статусом «LTD»?Цель состоит в том, чтобы идентифицировать диагноз или строку перед достижением статуса «LTD» для этого уникального идентификатора.Заранее спасибо!

Набор данных:

id <- c(123,123,123,321,321)
diag <- c("injury1", "injury2" , "cancer", "injury5", "cancer")
date <- as.Date(c('2008-11-1','2009-3-25','2010-3-14', '2015-3-14', '2015-4-15'))
status <- (c("STD", "STD", "LTD", "STD", "LTD"))

data <- data.frame(id, diag, date, status)

Результат (N для нет, Y для да):


1   123 injury1 2008-11-01  STD   N
2   123 injury2 2009-03-25  STD   Y
3   123 cancer  2010-03-14  LTD   NA
4   321 injury5 2015-03-14  STD   Y
5   321 cancer  2015-04-15  LTD   NA

1 Ответ

2 голосов
/ 23 сентября 2019

Насколько я понимаю, строка LTD является последней строкой в ​​группе при сортировке по date.Итак, задача состоит в том, чтобы создать новый столбец на основе сгруппированных данных, используя case_when:

library(dplyr)
data <- data %>% group_by(id) %>% arrange(date) %>%
mutate(yes_no =  case_when(row_number() == n()-1 ~ "yes",
                           status == "LTD" ~ NA_character_,
                           TRUE ~ "no")) %>% ungroup()

ОБНОВЛЕНИЕ : когда LTD не является последним значением в группе:

data <- data %>% mutate(lead = lead(status)) %>% group_by(id)  %>%
  mutate(yes_no =  case_when(lead == "LTD" ~ "yes",
                             status == "LTD" ~ NA_character_,
                             TRUE ~ "no")) %>% select(-lead) %>% ungroup()
...