R 如何捕获第一个事件的时间?
假设我有这样一个数据帧:R 如何捕获第一个事件的时间?,r,R,假设我有这样一个数据帧: set.seed(123) df<-data.frame(id=rep(LETTERS[1:3],each=4), days=as.integer(rnorm(12,100,10)), event=rbinom(12,1,0.3)) df<-df[with(df,order(id,days)),] df$event[sample(3,1:12,T)]<-NA df[2,3]<-0 df
set.seed(123)
df<-data.frame(id=rep(LETTERS[1:3],each=4),
days=as.integer(rnorm(12,100,10)),
event=rbinom(12,1,0.3))
df<-df[with(df,order(id,days)),]
df$event[sample(3,1:12,T)]<-NA
df[2,3]<-0
df
id days event
1 A 94 0
2 A 97 0
4 A 100 NA
3 A 115 0
8 B 87 1
5 B 101 0
7 B 104 1
6 B 117 0
9 C 93 0
10 C 95 1
12 C 103 0
11 C 112 0
对于这样的问题,通常最好将它们分成更小的块。首先,我们需要一个函数来为给定id选择正确的事件。例如:
get_index = function(event) {
test = (event==1)
if(sum(test, na.rm=TRUE))
return(which.max(event))
else
return(max(which(!test)))
}
和一个快速的健康检查:
R> event = c(0, 0, NA, 0)
R> get_index(event)
[1] 4
R> event = c(0, 1, 0, 0)
R> get_index(event)
[1] 2
接下来,我们按id将数据拆分并应用函数,因此
R> library(plyr)
R> ddply(df, .(id), summarize,
days = days[get_index(event)],
event=event[get_index(event)])
id days event
1 A 115 0
2 B 87 1
3 C 95 1
我们可以让它更高效(我们调用了两次
get_index
),但这应该可以让您开始了。这被压缩到一行中,并使用数据。表:
require(data.table) ## >= 1.9.2
setDT(df)[, min(days[event==1], max(days), na.rm=TRUE), by=id]
它可以按要求工作,但我仍然建议您将其分为两部分(遇到事件和未遇到事件),并合并表。当给定长度为0的向量时,这依赖于返回Inf
。在这种情况下,max(days)
生效
setDT
通过引用将data.frame
转换为data.table
require(data.table) ## >= 1.9.2
setDT(df)[, min(days[event==1], max(days), na.rm=TRUE), by=id]