Как создать переменную, которая соответствует нескольким столбцам? - PullRequest
0 голосов
/ 25 октября 2019

У меня есть набор данных для 10 пациентов, который выглядит следующим образом:

df = data.frame(id=c(1:10),
               event1=sample(1:4, 10, replace=T),
               date1=Sys.Date() - sample(100:500, 10, replace=T), 
               event2=sample(1:4, 10, replace=T),
               date2=Sys.Date() - sample(100:500, 10, replace=T), 
               event3=sample(1:4, 10, replace=T),
               date3=Sys.Date() - sample(100:500, 10, replace=T),
               follow_up=Sys.Date() - sample(10:100, 10, replace=T)) 

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

Я создал переменную для исхода кровотечения (в данном случае, если событие == 2) следующим образом:

all_vars_quo <- quo(c(event1, event2, event3))

df %>% rowwise() %>% 
  mutate(bleeding_no = sum(!!all_vars_quo==2, na.rm=TRUE)) %>% 
  mutate(bleeding = if_else(bleeding_no>0,1,0))

Теперь я хотел бы добавить дополнительную переменную "bleeding_date" с соответствующей датой кровотечения. Если у одного и того же пациента произошло более одного кровотечения, я хотел бы использовать дату, которая является самой далекой в ​​прошлом. Если кровотечения не произошло, я хотел бы использовать дату при последующем наблюдении. До сих пор я не смог придумать работающий кусок кода ... Любая помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 25 октября 2019

Я думаю, что подойдет, используя dplyr::case_when

df <- df %>% 
        mutate(bleeding_date = case_when(bleeding == 1 ~ min(date1, date2, date3),
                                         bleeding != 1 ~ follow_up
    )
)
0 голосов
/ 25 октября 2019

вот решение, которое не очень эстетично, но должно выполнять эту работу.

Я подумал, что ваши данные могут быть наложены между событием и датой. Таким образом, я создаю новое событие (продолжение), и у нас есть «dfevent» с четырьмя событиями (одно фиктивное) и dfdate с четырьмя датами.

Мы сохраняем только даты, которые соответствуют событию== 2, а затем для каждой строки выбираем наименьшую дату.

df=df %>% rowwise() %>% 
  mutate(bleeding_no = sum(!!all_vars_quo==2, na.rm=TRUE)) %>% 
  mutate(bleeding = if_else(bleeding_no>0,1,0))%>%
  mutate(eventFU=2)


dfevent=df[,c(2,4,6,11)]
dfdate=df[,c(3,5,7,8)]

dfdatef=dfdate

dfdatef[!dfevent==2]=NA

df=cbind(df,date=apply(dfdatef,1,min,na.rm=TRUE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...