Сложение чисел после операции if в R

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

subject<-c(111,111,111,222,222,333,333,333,333)
date<-as.Date(c("2010-12-12","2011-12-01","2009-8-7","2010-5-7","2011-3-7","2011-8-5","2013-8-27","2016-9-3","2011-8-5"))
medicationCourses<-c(1,0,NA,3,4,2,4,5,6)

data<-data.frame(subject,date,medicationCourses)

data

  subject      date        medicationCourses
1     111    2010-12-12             1
2     111    2011-12-01             0
3     111    2009-08-07             NA
4     222    2010-05-07             3
5     222    2011-03-07             4
6     333    2011-08-05             2
7     333    2013-08-27             4
8     333    2016-09-03             5
9     333    2011-08-05             6

У меня также есть дата госпитализации.

hospitalSubject<-c(111,222,333)
admissionDate<-as.Date(c("2011-12-31","2013-12-31","2013-12-31"))

hospitalData<-data.frame(hospitalSubject,admissionDate)

hospitalData

  hospitalSubject admissionDate
1             111    2011-12-31
2             222    2013-12-31
3             333    2013-12-31

Я хочу суммировать количество курсов лекарств в день поступления или до него и получить следующий результат:

subject    admissionDate   totalMedicationCourses
 111         2011-12-31            1
 222         2013-12-31            7
 333         2013-12-31            12

Интересно, кто-нибудь может дать мне знать, как я могу сделать это в R? Я начинающий пользователь R, поэтому любые рекомендации будут высоко ценится!

1 ответ

Решение

Одним из вариантов будет merge the two datasets by subject/hospitalSubject in the two datasets, subset the rows with date <= admissionDate, and get the sum of 'medicationCourses' grouped by 'subject/admissionDate' with aggregate

d1 <- subset(merge(data, hospitalData, by.x='subject', 
           by.y='hospitalSubject'), date <= admissionDate)

aggregate(medicationCourses~subject+admissionDate, d1, sum,
               na.rm=TRUE, na.action=NULL)
#  subject admissionDate medicationCourses
#1     111    2011-12-31                 1
#2     222    2013-12-31                 7
#3     333    2013-12-31                12

Или мы можем использовать data.table by converting the 'data.frame' to 'data.table' (setDT(data)), set the key as 'subject' (setkey(), and join with hospitalData, filter the rows where date <= admissionDate и получить sum of 'medicationCourses', grouped by 'subject' and 'admissionDate'.

library(data.table)
setkey(setDT(data), subject)[hospitalData][date <= admissionDate, 
  list(TotalMedicationCourses=sum(medicationCourses, na.rm=TRUE)),
        list(subject, admissionDate)]
#    subject admissionDate TotalMedicationCourses
#1:     111    2011-12-31                      1
#2:     222    2013-12-31                      7
#3:     333    2013-12-31                     12

Or a similar approach with dplyr

library(dplyr)
  left_join(data, hospitalData, by=c('subject'='hospitalSubject')) %>%
        filter(date <=admissionDate) %>% 
        group_by(subject, admissionDate) %>% 
        summarise(TotalMedicationCourses=sum(medicationCourses, na.rm=TRUE))
Другие вопросы по тегам