R - Свернуть данные сгруппированными наблюдениями за рядами - PullRequest
0 голосов
/ 17 декабря 2018

Я работаю с большим набором данных о госпитализации.Многие пациенты имеют две или более госпитализаций, и их история болезни может быть неполной при одной или нескольких госпитализациях.Я хотел бы свести всю информацию о каждой из их госпитализаций в единый список медицинских проблем для каждого пациента.

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

 id <- c("123","456","789","101","123","587","456","789")
 HTN <- c(TRUE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 
 FALSE)
 DM2 <- c(FALSE, FALSE, TRUE, TRUE, FALSE, TRUE, FALSE, TRUE)
 TIA <- c(TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, TRUE)
 df <- data.frame(id,HTN,DM2,TIA)
 df

, который получается:

 > df
    id   HTN   DM2   TIA
 1 123  TRUE FALSE  TRUE
 2 456 FALSE FALSE  TRUE
 3 789 FALSE  TRUE  TRUE
 4 101 FALSE  TRUE  TRUE
 5 123 FALSE FALSE FALSE
 6 587  TRUE  TRUE  TRUE
 7 456 FALSE FALSE  TRUE
 8 789 FALSE  TRUE  TRUE

Я бы хотел, чтобы мой вывод выглядел так:

  id <- c("101","123","456","587","789")
  HTN <- c(FALSE,TRUE,FALSE,TRUE,FALSE)
  DM2 <- c(TRUE,FALSE,FALSE,TRUE,TRUE)
  TIA <- c(TRUE,TRUE,TRUE,TRUE,TRUE)
  df2 <- data.frame(id,HTN,DM2,TIA)
  df2

    id  HTN  DM2 TIA
 1 101 FALSE  TRUE TRUE
 2 123  TRUE FALSE TRUE
 3 456 FALSE FALSE TRUE
 4 587  TRUE  TRUE TRUE
 5 789 FALSE  TRUE TRUE

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

 df3 <- df %>%
   arrange(id) %>%
   group_by(id)

Оглядываясь вокруг, я не смогчтобы найти особенно элегантный способ сделать это.Есть ли какая-то приятная функция dplyr, которую я пропускаю?

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Базовая опция R будет

aggregate(.~ id, df, any)
#   id   HTN   DM2  TIA
#1 101 FALSE  TRUE TRUE
#2 123  TRUE FALSE TRUE
#3 456 FALSE FALSE TRUE
#4 587  TRUE  TRUE TRUE
#5 789 FALSE  TRUE TRUE

Или с rowsum

rowsum(+(df[-1]), group = df$id) > 0
0 голосов
/ 17 декабря 2018

Если мы предпочитаем data.table, мы можем использовать:

setDT(df)[, lapply(.SD, any), keyby = id]
    id   HTN   DM2  TIA
1: 101 FALSE  TRUE TRUE
2: 123  TRUE FALSE TRUE
3: 456 FALSE FALSE TRUE
4: 587  TRUE  TRUE TRUE
5: 789 FALSE  TRUE TRUE
0 голосов
/ 17 декабря 2018

Мы можем использовать

df %>% group_by(id) %>% summarize_all(any)
# A tibble: 5 x 4
#   id    HTN   DM2   TIA  
#   <fct> <lgl> <lgl> <lgl>
# 1 101   FALSE TRUE  TRUE 
# 2 123   TRUE  FALSE TRUE 
# 3 456   FALSE FALSE TRUE 
# 4 587   TRUE  TRUE  TRUE 
# 5 789   FALSE TRUE  TRUE

Таким образом, мы действительно сначала сгруппируемся по id, как вы предложили.Затем мы summarize all переменные с функцией any: мы предоставляем логический вектор (например, HTN для пациента 101) и возвращаем TRUE, если в любой из строк у нас есть TRUEи FALSE в противном случае.

...