Выберите самую последнюю дату после контрольной даты из двух кадров данных в R - PullRequest
2 голосов
/ 07 февраля 2020

Я использую R, и у меня есть два набора данных, один из которых содержит контрольную дату (дата диагностики рака), а другой содержит даты сканирования. У некоторых пациентов было многократное сканирование до и после даты постановки диагноза. Мне нужно сделать первое сканирование после даты диагностики. Затем я планирую объединить наборы данных, чтобы мы могли проанализировать дополнительные данные (не описаны), которые находятся во фреймах данных.

Я использую lubridate, tidyverse и dplyr.

Структура первого набора данных «a1»:

patient_id      diagnosis_date
1               2018-06-26
2               2014-10-15
3               2016-02-19
4               2018-06-30

Структура второго набора данных «a2»:

patient_id      mri_date
1               2018-04-19
1               2018-07-12
1               2018-08-11
2               2014-11-01
3               2016-02-25
3               2018-10-07

Я хочу выбрать первое сканирование после даты диагностики mri_date>=diagnosis_date для каждого пациента_ид. Например, mri_date 2018-07-12 для пациента 1.

Я попытался объединить наборы данных combined<-merge(a1,a2,by="patient_id",all.x=TRUE), а затем планировал отфильтровать и нарезать. Тем не менее, это удалило несколько значений mri_date для каждого пациента и просто заняло первое.

Я пытался найти ответ, но не могу найти его.

Я был бы очень благодарен за вашу помощь.

1 Ответ

1 голос
/ 07 февраля 2020

Одним из способов с dplyr было бы объединение a1 и a2 на "patient_id", arrange их на основе mri_date и выбор первой строки, где mri_date больше diagnosis_date.

library(dplyr)

inner_join(a1, a2, by = 'patient_id') %>%
  arrange(patient_id, mri_date) %>%
  group_by(patient_id) %>%
  slice(which.max(mri_date > diagnosis_date))

#  patient_id diagnosis_date mri_date  
#       <int> <date>         <date>    
#1          1 2018-06-26     2018-07-12
#2          2 2014-10-15     2014-11-01
#3          3 2016-02-19     2016-02-25

данные

a1 <- structure(list(patient_id = 1:4, diagnosis_date = structure(c(17708, 
16358, 16850,17712), class = "Date")), row.names = c(NA, -4L), class = "data.frame")

a2 <- structure(list(patient_id = c(1L, 1L, 1L, 2L, 3L, 3L), mri_date = 
structure(c(17640, 17724, 17754, 16375, 16856, 17811), class = "Date")), 
row.names = c(NA,-6L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...