创建重复的开始和结束日期

时间:2014-09-22 17:46:09

标签: r date max grouping

我有一个包含许多变量的数据集。感兴趣的是:ID,剧集,开始,结束,评估日期。显示了一个示例数据集

 ID Episode     Start         End  AssessmentDate
 1       1  1/1/2012  12/21/2012        1/1/2012
 1       1  1/1/2010  12/21/2012      12/12/2012
 1       1  1/1/2010  12/21/2012      12/21/2012
 1       2  1/1/2013           .        1/2/2013
 1       2  1/1/2013           .        2/2/2013
 1       2  1/1/2013           .        3/2/2013
 2       1  1/1/2012           .        4/1/2012
 2       1  1/1/2010           .       5/12/2012
 2       1  1/1/2010           .       6/21/2012
 2       2  1/1/2013           .        7/2/2013
 2       2  1/1/2013           .        8/2/2013
 2       2  1/1/2013           .        9/2/2013

我有每个人的开始日期,但没有任何结束日期。对于10,000名患者,我想确定每一集和每位患者的结束日期。我希望结束日期是每集编号的最后评估日期,我希望在第一个和最后一个评估日期之间的每一行都有这个日期。

我正在阅读一些关于根据ID和Episode将数据集分成许多较小部分的内容,但我觉得应该有一种更简单的方法来做到这一点。我是来自SAS的R新手,在SAS这样的问题不会给我带来太多麻烦。

如果您对我的数据准备工作有任何意见,我将不胜感激。

3 个答案:

答案 0 :(得分:1)

您可以使用ddply()图书馆中的plyr按剧集查找最长评估日期:

df <- data.frame(id=1, Episode=c(1,1,1,2,2,2), AssessmentDate=as.Date(c("2012-01-01", "2012-12-12", "2012-12-21", "2013-01-02", "2013-02-02", "2013-03-02")))

library(plyr)

df <- ddply(df, .(Episode), transform, End=max(AssessmentDate))
df

这给了你:

  ID Episode AssessmentDate        End
1  1       1     2012-01-01 2012-12-21
2  1       1     2012-12-12 2012-12-21
3  1       1     2012-12-21 2012-12-21
4  1       2     2013-01-02 2013-03-02
5  1       2     2013-02-02 2013-03-02
6  1       2     2013-03-02 2013-03-02

如果您想通过患者进行,可以ddply()使用.(ID)(假设识别患者)或类似的事情。

也可以使用by()执行此操作,但会变得有点复杂,因为它会将数据拆分为由分组变量值标识的列表。

编辑:同样,如果Episode在整个数据框中不是唯一的,即每个患者都重复一次,您可以按两个变量分组,即ddply(df, .(ID, Episode), ...)

答案 1 :(得分:1)

假设您已将您的值正确读入日期并处理“。”就像R中的NA值一样,您的样本数据框应具有此结构

dd<-structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 1L), Episode = c(1L, 
1L, 1L, 2L, 2L, 2L), Start = structure(c(15340, 14610, 14610, 
15706, 15706, 15706), class = "Date"), End = structure(c(15695, 
15695, 15695, NA, NA, NA), class = "Date"), AssessmentDate = structure(c(15340, 
15686, 15695, 15707, 15738, 15766), class = "Date")), .Names = c("ID", 
"Episode", "Start", "End", "AssessmentDate"), row.names = c(NA, 
-6L), class = "data.frame")

然后,您可以使用

基础ave()功能计算每集的最长评估日期
dd$NewEnd <- ave(dd$AssessmentDate, dd$Episode, FUN=max)

给出了

  ID Episode      Start        End AssessmentDate     NewEnd
1  1       1 2012-01-01 2012-12-21     2012-01-01 2012-12-21
2  1       1 2010-01-01 2012-12-21     2012-12-12 2012-12-21
3  1       1 2010-01-01 2012-12-21     2012-12-21 2012-12-21
4  1       2 2013-01-01       <NA>     2013-01-02 2013-03-02
5  1       2 2013-01-01       <NA>     2013-02-02 2013-03-02
6  1       2 2013-01-01       <NA>     2013-03-02 2013-03-02

这里我没有覆盖现有的End值。我不确定在不匹配的情况下想做什么。

答案 2 :(得分:1)

或使用data.table(来自@MrFlicks帖子的数据)

 library(data.table)
 setDT(dd)[, NewEnd:=max(AssessmentDate), by=Episode]
 dd
 #      ID Episode      Start        End AssessmentDate     NewEnd
 #1:  1       1 2012-01-01 2012-12-21     2012-01-01 2012-12-21
 #2:  1       1 2010-01-01 2012-12-21     2012-12-12 2012-12-21
 #3:  1       1 2010-01-01 2012-12-21     2012-12-21 2012-12-21
 #4:  1       2 2013-01-01       <NA>     2013-01-02 2013-03-02
 #5:  1       2 2013-01-01       <NA>     2013-02-02 2013-03-02
 #6:  1       2 2013-01-01       <NA>     2013-03-02 2013-03-02

dplyr

library(dplyr)
 dd %>% 
    group_by(Episode) %>% 
    mutate(NewEnd=max(AssessmentDate))