我有一个包含许多变量的数据集。感兴趣的是: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这样的问题不会给我带来太多麻烦。
如果您对我的数据准备工作有任何意见,我将不胜感激。
答案 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))