假设我有一个数据框,例如:
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
),但这应该可以帮助您入门。