Необходимо сделать несколько шагов, но это должно дать вам желаемый результат.
Обратите внимание, однако, что во входных данных, по-видимому, имеется опечатка: я предполагаю, что вы имели в виду "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"))