我是一名R初学者,并且已经陷入了这个看似简单的问题。我有一个包含4列的大型数据框; id,观察日期,值(alb)和结束日期。单个id在不同日期可能有1到15个左右的观察结果。结束日期是事件或审查的时间,每个ID一个。
id date alb end
1143 2010-03-23 41 2010-12-15
1143 2010-06-29 39 2010-12-15
1144 2008-01-01 34 2009-08-06
1145 2010-03-23 42 2012-10-25
1145 2011-01-12 45 2012-10-25
对于使用alb作为时变协变量的生存分析,我试图为每个观察创建一个具有开始和停止时间列的情节。我正在尝试创建一个列,其中停止时间是下一个alb观察的开始时间或结束时间,如果该id没有进一步的alb观察。像这样:
id date alb end start stop
1143 2010-03-23 41 2010-12-15 2010-03-23 2010-06-29
1143 2010-06-29 39 2010-12-15 2010-06-29 2010-12-15
1144 2008-01-01 34 2009-08-06 2008-01-01 2009-08-06
1145 2010-03-23 42 2012-10-25 2010-03-23 2011-01-12
1145 2011-01-12 45 2012-10-25 2011-01-12 2012-10-25
我很难创建一列停止时间。我试图用嵌套的if else语句创建一个函数。有没有人有一个简单的方法?提前谢谢!
在回复r2evans时,这是data.frame的很大一部分,其中dplyr动作的某些值返回1970-01-01。 (完整的数据框大约是130,000行)。感谢
id date alb end
1143 2010-03-23 41.0 1996-08-10
1143 2010-06-29 39.0 1996-08-10
1143 2011-01-12 42.0 1996-08-10
1143 2010-09-28 47.0 1996-08-10
1143 2011-07-19 40.0 1996-08-10
1143 2012-06-12 41.0 1996-08-10
1143 2013-06-25 40.0 1996-08-10
1143 2013-12-26 40.0 1996-08-10
1143 2014-06-15 40.0 1996-08-10
1143 2014-12-26 39.9 1996-08-10
1144 2008-01-01 34.0 2015-04-28
1145 2010-03-23 42.0 2015-04-28
1145 2012-01-13 44.0 2015-04-28
1145 2012-06-15 41.0 2015-04-28
答案 0 :(得分:3)
您的数据:
data.frame(
id=c( 1143, 1143, 1144, 1145, 1145 ),
date=c("2010-03-23", "2010-06-29", "2008-01-01", "2010-03-23", "2011-01-12" ),
alb=c( 41, 39, 34, 42, 45 ),
end=c("2010-12-15", "2010-12-15", "2009-08-06", "2012-10-25", "2012-10-25" )
)
一种技巧是使用dplyr
:
library(dplyr)
df %>%
group_by(id) %>%
mutate(start=date, stop=lead(start, default=end[1]))
## Source: local data frame [5 x 6]
## Groups: id
##
## id date alb end start stop
## 1 1143 2010-03-23 41 2010-12-15 2010-03-23 2010-06-29
## 2 1143 2010-06-29 39 2010-12-15 2010-06-29 2010-12-15
## 3 1144 2008-01-01 34 2009-08-06 2008-01-01 2009-08-06
## 4 1145 2010-03-23 42 2012-10-25 2010-03-23 2011-01-12
## 5 1145 2011-01-12 45 2012-10-25 2011-01-12 2012-10-25
如果您更愿意只使用base
功能:
do.call('rbind', by(df, df$id, function(x) {
cbind(x, start=x$date, stop=lead(x$date, default=x$end[1]))
}))
## id date alb end start stop
## 1143.1 1143 2010-03-23 41 2010-12-15 2010-03-23 2010-06-29
## 1143.2 1143 2010-06-29 39 2010-12-15 2010-06-29 2010-12-15
## 1144 1144 2008-01-01 34 2009-08-06 2008-01-01 2009-08-06
## 1145.4 1145 2010-03-23 42 2012-10-25 2010-03-23 2011-01-12
## 1145.5 1145 2011-01-12 45 2012-10-25 2011-01-12 2012-10-25
答案 1 :(得分:1)
示例数据:
dat<-read.table(text="
id date alb end
1143 2010-03-23 41 2010-12-15
1143 2010-06-29 39 2010-12-15
1144 2008-01-01 34 2009-08-06
1145 2010-03-23 42 2012-10-25
1145 2011-01-12 45 2012-10-25", header=TRUE, stringsAsFactors=FALSE)
解决方案:
dat$start <- dat$date
dat$stop[!duplicated(dat$id, fromLast = TRUE)] <- dat$end[!duplicated(dat$id, fromLast = TRUE)]
dat$stop[duplicated(dat$id, fromLast = TRUE)] <- dat[duplicated(dat$id), "date"]
dat
# id date alb end start stop
#1 1143 2010-03-23 41 2010-12-15 2010-03-23 2010-06-29
#2 1143 2010-06-29 39 2010-12-15 2010-06-29 2010-12-15
#3 1144 2008-01-01 34 2009-08-06 2008-01-01 2009-08-06
#4 1145 2010-03-23 42 2012-10-25 2010-03-23 2011-01-12
#5 1145 2011-01-12 45 2012-10-25 2011-01-12 2012-10-25