От длинных до широкоформатных уровней факторов в виде двоичных переменных и дат - PullRequest
0 голосов
/ 30 ноября 2018

Я хочу сделать длинный формат широкоформатным и использовать коэффициенты Уровни в качестве двоичных переменных.Это означает, что если уровень фактора существует хотя бы один раз, то в переменной должен быть 1.Иначе 0. Кроме того, я хочу, чтобы даты были переменными значениями date.1, date.2, ...

. У меня есть следующее

data_sample <- data.frame(
  PatID  = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L),
  date   = c("2016-12-14", "2017-02-04", "NA", "NA", "2012-27-03", "2012-04-21", "2010-02-03", "2011-03-05", "2014-08-25"),
  status = c("COPD", "CPOD", "NA", "NA", "Cardio", "CPOD", "Cardio", "Cardio", "Cerebro")
)

.:

PatID  COPD Cardio Cerebro date.COPD.1 date.COPD.2 date.Cardio.1  date.Cardio.2  date.Cerebro.1
1        1    0       0    2016-12-14  2017-02-04     NA               NA          NA
2        0    1       0      NA           NA        2012-03-27         NA          NA 
3        1    1       1    2012-04-21     NA        2010-02-03    2011-03-05      2014-08-25      

1 Ответ

0 голосов
/ 30 ноября 2018

Необходимо сделать несколько шагов, но это должно дать вам желаемый результат.

Обратите внимание, однако, что во входных данных, по-видимому, имеется опечатка: я предполагаю, что вы имели в виду "COPD" вместо "CPOD" потому что это то, что вы ожидали, вывод говорит мне.

Первый шаг - сделать строку "NA" явным отсутствующим значением, т.е. NA.

data_sample[data_sample == "NA"] <- NA

Теперь используйте data.table::dcast для изменения формы.

library(data.table)  
setDT(data_sample)

# create id column
data_sample[, id := rowid(status), by = PatID]
dt1 <- dcast(data_sample[!is.na(date)], PatID ~ status, fun.aggregate = function(x) +any(x))
dt2 <- dcast(data_sample[!is.na(date)], PatID ~ paste0("date_", status) + id, value.var = "date")

Наконец, объедините оба data.tables

out <- dt1[dt2, on = 'PatID']
out
#  PatID Cardio Cerebro COPD date_COPD_1 date_COPD_2 date_Cardio_1 date_Cardio_2 date_Cerebro_1
#1:     1      0       0    1  2016-12-14  2017-02-04          <NA>          <NA>           <NA>
#2:     2      1       0    0        <NA>        <NA>    2012-27-03          <NA>           <NA>
#3:     3      1       1    1  2012-04-21        <NA>    2010-02-03    2011-03-05     2014-08-25

data

data_sample <- data.frame(
  PatID   = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L),
  date = c("2016-12-14", "2017-02-04", "NA", "NA", "2012-27-03", "2012-04-21", "2010-02-03", "2011-03-05", "2014-08-25"),
  status =c("COPD", "COPD", "NA", "NA", "Cardio", "COPD", "Cardio", "Cardio", "Cerebro"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...