首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中的if操作后将数字相加

在R中的if操作后将数字相加
EN

Stack Overflow用户
提问于 2015-05-29 14:18:41
回答 1查看 44关注 0票数 2

我有一套数据,其中包括病人在某一日期服用的药物疗程数。

代码语言:javascript
复制
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

我还有他们的入院日期。

代码语言:javascript
复制
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

我想概述在收生日期或之前的药物治疗课程数目,并得出以下结果:

代码语言:javascript
复制
subject    admissionDate   totalMedicationCourses
 111         2011-12-31            1
 222         2013-12-31            7
 333         2013-12-31            12

我想知道有没有人能让我知道我怎么能在R中做到这一点?我是一个R的新手用户,所以任何的指导都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-29 14:22:54

一种选择是由subject/hospitalSubject在两个数据集中使用subject/hospitalSubject将两个数据集中在一起,用date <= admissionDate表示行,并通过aggregate获得按'subject/admissionDate‘分组的'medicationCourses’的sum

代码语言:javascript
复制
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,将“data.frame”转换为“data.table”(setDT(data)),将键设置为“subject”(setkey(),并与hospitalData连接,过滤date <= admissionDate所在的行,并获得按“subject”和“admissionDate”分组的“医学课程”的sum

代码语言:javascript
复制
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

或使用dplyr的类似方法

代码语言:javascript
复制
library(dplyr)
  left_join(data, hospitalData, by=c('subject'='hospitalSubject')) %>%
        filter(date <=admissionDate) %>% 
        group_by(subject, admissionDate) %>% 
        summarise(TotalMedicationCourses=sum(medicationCourses, na.rm=TRUE))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30531955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档