Как объединить строки в факторную переменную с тремя уровнями? - PullRequest
1 голос
/ 29 марта 2020

У меня есть набор данных, в котором у некоторых участников есть несколько строк, и мне нужно агрегировать данные таким образом, чтобы у каждого участника была только одна строка. Набор данных содержит различные типы переменных (например, факторы, дата, возраст и т. Д. c.) Я создал код, который работает и выглядит следующим образом:

example4 <- SMARTdata_50j_diagc_2016  %>% 
  group_by( Patient_Id ) %>%  
  summarise( Groep = first( Groep ),
             Ziekenhuis_Nr = first( Ziekenhuis_Nr ),
             Ziekenhuistype = first( Ziekenhuistype ),
             aantalDBC = n(),
             aantalVervolg = sum( as.numeric( Zorgtype_Code ) ),
             Leeftijd = mean( Lft_patient_openenDBC ),
             MRI_nee_ja = max( ifelse( MRI_nee_ja == 0, 0, 1 ) ),
             aantalMRI = sum( MRI_Aantal ),
             Artroscopie_nee_ja = max( ifelse( Artroscopie_nee_jaz_jam == 0, 0, 1 ) ),
             aantalArtroscopie = sum( Artroscopie_aantal ),
             overigDBC = mean( Aantal_overigeDBC_bijopenen ),
             DBC_open = min( open_DBC ), 
             DBC_sluiten = max( sluiten_DBC ) ) %>% 
  as.data.frame()

Этот код дает мне по одной строке для каждого участник. Однако у меня есть еще одна переменная, которую мне нужно включить в новый фрейм данных, но я не знаю, как это сделать. Переменная, которую мне нужно добавить, называется «Diagnose_Code» и представляет собой фактор с двумя уровнями, а именно 0 (обозначает 1801) и 1 (обозначает 1805).

Для участников, имеющих несколько строк (в исходный кадр данных), есть участники, которые имеют как 0, так и 1 для этой переменной. Теперь в моем новом фрейме данных я хочу создать переменную для «Diagnose_Code» с тремя уровнями: 0, если все строки этого участника равны 0, 1, если все строки этого участника равны 1, и 2, если строки этот участник имеет и 0 и 1.

Я не знаю, как сделать эту работу. Я немного боролся с кодом ifelse, но безуспешно. Кто-нибудь знает, как я могу заставить это работать в моем коде? Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 29 марта 2020

Используя набор данных игрушек, это может быть достигнуто следующим образом:

library(dplyr)

df <- data.frame(
  id = rep(1:3, each = 3),
  diagnosis_code = c(rep(1,3), rep(0, 3), c(1, 0, 1)),
  stringsAsFactors = FALSE
)
df %>% 
  group_by(id) %>% 
  summarise(diagnosis_code = case_when(
    all(diagnosis_code == 1) ~ 1,
    all(diagnosis_code == 0) ~ 0,
    TRUE ~ 2
  ))
#> # A tibble: 3 x 2
#>      id diagnosis_code
#>   <int>          <dbl>
#> 1     1              1
#> 2     2              0
#> 3     3              2

Создано в 2020-03-29 пакетом Представить (v0.3.0)

2 голосов
/ 29 марта 2020
df %>% 
  group_by(Patient_Id) %>% 
  summarise(Diagnose_Code = case_when(n_distinct(Diagnose_Code) == 2 ~ 3, 
                                      sum(Diagnose_Code) ==  1 ~ 1, 
                                      TRUE ~ 0 ))
2 голосов
/ 29 марта 2020

Использование ifelse должно работать:

df %>%
group_by(id) %>%
  summarise(diag=ifelse(max(diag)!=min(diag), 2, 
                          ifelse(max(diag==1), 1, 0)))

# A tibble: 3 x 2
     id  diag
  <dbl> <dbl>
1     1     2
2     2     1
3     3     0

Данные :

df <- data.frame(id=c(1,1,1,2,2,2,3,3,3), diag=c(1,0,0,1,1,1,0,0,0))
...