Как изменить БОЛЬШОЙ формат данных: пациенты с 2 визитами и несколькими переменными для каждого визита - PullRequest
0 голосов
/ 19 июня 2019

У меня большой фрейм данных (15000 наблюдений 800 переменных). Наблюдения относятся к пациентам в 2 разных временных точках (то есть 15000 человек = 10000 пациентов при базовом посещении + 5000 из первых 10000 человек, которые вернулись для последующего посещения). Пациенты имеют переменную PatientID (PtID: фактор с 10000 уровнями) и переменную посещения (Визит: фактор с 2 уровнями: 1 для исходного уровня, 2 для последующего наблюдения).

Пример данных

    PtID Visit Age_Visit Brain_colour    BP       .................
     40    1        60         NA        130 
     40    2        62         blue      120
     70    1        50         green     145
     101   1        67         red       67
     263   1        78         red       178
     263   2        80         green     90
     143   1        15         blue      123
     219   1        69         red       110
     219   2        70         green     NA

Я хотел бы изменить формат фрейма данных, чтобы каждый пациент представлял собой одно наблюдение с 800 базовыми переменными, повторяемыми в качестве другой переменной наблюдения (переход от 15000 наблюдений к 800 переменным до 10000 наблюдений (только для базовых пациентов). ) из 1600 переменных). 5000 пациентов без наблюдения будут иметь значения NA для всех переменных наблюдения.

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

 d <- setDT(x)[, list(WorryHighBGNow = paste(WorryHighBGNow, 
 collapse = ', ')),by = c('PtID')] 

Кроме того, я хотел бы создать новые переменные последующих действий. Как я могу легко изменить мои данные выше на данные ниже для такого большого кадра данных?

     PtID Age_Visit1 Age_Visit2 Brain_colour1 Brain_colour2  BP1       BP2       .................
     40      60       62          NA          blue           120       145 
     70      50       NA          green        NA            145       NA
     101     67       NA          red          NA             67       NA
     263     78       80          red         green          178       90
     ...................

Ответы [ 2 ]

2 голосов
/ 20 июня 2019
library(tidyverse)
df %>%
  gather(col, val, -c(PtID, Visit)) %>%
  unite("col2", c("col", "Visit")) %>%
  spread(col2, val)

  PtID Age_Visit_1 Age_Visit_2 BP_1 BP_2 Brain_colour_1 Brain_colour_2
1   40          60          62  130  120           <NA>           blue
2   70          50        <NA>  145 <NA>          green           <NA>
3  101          67        <NA>   67 <NA>            red           <NA>
4  143          15        <NA>  123 <NA>           blue           <NA>
5  219          69          70  110 <NA>            red          green
6  263          78          80  178   90            red          green

Edit: Чтобы сохранить типы переменных, одним из подходов было бы выполнить одну и ту же задачу отдельно для всех символьных столбцов, всех числовых столбцов и т. Д., А затем связать их вместе.

# First collect list of all the numeric and character columns
df_num_cols <- df %>% select_if(is.numeric) %>% names()
df_char_cols <- df %>% select_if(is.character) %>% names()

df_nums <- df %>%
  select_at(vars(c("PtID", Visit, df_num_cols))) %>%
  gather(col, val, -c(PtID, Visit)) %>%
  unite("col2", c("col", "Visit")) %>%
  spread(col2, val)

df_chars <- df %>%
  select_at(vars(c("PtID", Visit, df_char_cols))) %>%
  gather(col, val, -c(PtID, Visit)) %>%
  unite("col2", c("col", "Visit")) %>%
  spread(col2, val)

df2 <- bind_cols(df_nums, df_chars)
df2 %>% str()

'data.frame':   6 obs. of  8 variables:
 $ PtID          : int  40 70 101 143 219 263
 $ Age_Visit_1   : int  60 50 67 15 69 78
 $ Age_Visit_2   : int  62 NA NA NA 70 80
 $ BP_1          : int  130 145 67 123 110 178
 $ BP_2          : int  120 NA NA NA NA 90
 $ PtID1         : int  40 70 101 143 219 263
 $ Brain_colour_1: chr  NA "green" "red" "blue" ...
 $ Brain_colour_2: chr  "blue" NA NA NA ...
0 голосов
/ 20 июня 2019

Изменение Dataframe с LONG на WIDE (это сохранит NUMERIC класс, но все равно автоматически преобразует все ФАКТОРЫ в CHARACTERS):

         library(tidyr)                              
         df_wide <- df_long %>%
         gather(col, val, -c(PtID, Visit)) %>%
         unite("col2", c("col", "Visit")) %>%
         spread(col2, val, convert = TRUE)

Преобразование символов обратно в ФАКТОРЫ:

         df_wide <- as.data.frame(unclass(df_wide))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...