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]