2016-04-11 4 views
0

Мне нужно связать два кадра данных. Один фрейм данных (STTest) состоит из теста на стрептококк для 100 человек. Другой кадр данных (STCase) состоит только из тех людей, которые испытали положительный результат. Я включил фрагмент каждого кадра данных ниже:При использовании R для связи двух кадров данных с общим столбцом, как я могу указать, что он связывает только наблюдения за определенный промежуток времени?

STTest

patient_master_id Testdate 
1   ID001   2011-07-16 
2   ID002   2011-09-16 
..... 

STCase

patient_master_id reporteddate 
1   ID001   2011-10-13 
2   ID002   2011-09-27 
... 

Я могу связать эти случаи, основанные на обоих наборах данных, совместно использующих общий столбец, который идентифицирует идентификатор пациента , Однако мне нужно всего лишь связать случаи, когда сообщаемый случай находится в течение 15 дней с даты тестирования. Какой код я использую для установки условия, в котором R связывает случаи только с тестами в течение определенного периода времени?

Спасибо!

ответ

0

Сначала проверьте класс столбцов Testdate и reporteddate в наборах данных STTest и STCase, используя функцию класса().

Если это не дата, то сначала введите столбцы в Date.

> STTest$Testdate <- as.Date(STTest$Testdate) 
> STCase$reporteddate <- as.Date(STCase$reporteddate) 

После этого объедините два набора данных.

> int_ans <- merge(STTest,STCase) 
> int_ans 
    patient_master_id Testdate reporteddate 
1    ID001 2011-07-16 2011-10-13 
2    ID002 2011-09-16 2011-09-27 

Теперь, выберите строки, которые удовлетворяют условию.

> int_ans[int_ans$reporteddate < int_ans$Testdate + 15,] 
    patient_master_id Testdate reporteddate 
2    ID002 2011-09-16 2011-09-27 
0

Возможно, вы можете попробовать sqldf.

library(sqldf) 

df1<-data.frame(patient_master_id = c('ID001','ID002'), 
      Testdate= c('2011-07-16','2011-09-16')) 

df1$Testdate<-as.Date(df1$Testdate) 

df2<-data.frame(patient_master_id = c('ID001','ID002'), 
      reporteddate= c('2011-10-13','2011-09-27')) 

df2$reporteddate<-as.Date(df2$reporteddate) 

window = 15 

sqldf(paste("select A.patient_master_id, Testdate, reporteddate 
     from df1 as A INNER JOIN df2 as B 
     WHERE A.patient_master_id = B.patient_master_id 
     AND (B.reporteddate - A.Testdate)<",window)) 

Вы можете настроить способ соединения и временное окно для их слияния соответственно.

+0

Спасибо! Этот код правильно связал даты отправки с соответствующими датами тестирования. Но эта команда, похоже, подбирала эти три наблюдения. Знаете ли вы, как я связал бы его с остальной частью объединенного фрейма данных, но в то же время не сообщал даты датированных дат предыдущих дат тестирования тем же людям? –

+0

@RSnow Я не уверен, понимаю ли я ваш вопрос. Можете ли вы привести пример? – Lamothy