假设我有一个数据框,例如:

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


我如何通过忽略NA来捕获days到第一个event=1,如果没有事件,则返回最大天数,例如:

df2
   id days event
3   A  115     0
8   B   87     1
10  C   95     1

最佳答案

对于此类问题,通常最好将它们分成较小的块。首先,我们需要一个函数为给定的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),但这应该可以帮助您入门。

07-24 09:38
查看更多