R 如何在纵向数据帧中指示第一个事件观测并删除其余的事件观测?
嗨,我有一个数据框,如下所示:R 如何在纵向数据帧中指示第一个事件观测并删除其余的事件观测?,r,dataframe,R,Dataframe,嗨,我有一个数据框,如下所示: id=rep(c(1:3),each=3) status=rep(c(1,0,1),each=3) event=c(0,1,1,0,0,0,1,1,1) cbind(id,status,event) id status event [1,] 1 1 0 [2,] 1 1 1 [3,] 1 1 1 [4,] 2 0 0 [5,] 2
id=rep(c(1:3),each=3)
status=rep(c(1,0,1),each=3)
event=c(0,1,1,0,0,0,1,1,1)
cbind(id,status,event)
id status event
[1,] 1 1 0
[2,] 1 1 1
[3,] 1 1 1
[4,] 2 0 0
[5,] 2 0 0
[6,] 2 0 0
[7,] 3 1 1
[8,] 3 1 1
[9,] 3 1 1
我希望保留或指示'event'==1之前的行和'event'==1的第一行,如下所示:
id status event ind
1 1 0 T
1 1 1 T
1 1 1 F
2 0 0 T
2 0 0 T
2 0 0 T
3 1 1 T
3 1 1 F
3 1 1 F
或
有人有好主意吗?
非常感谢 如果
DF
是输入数据帧,则:
DF$ind <- ave(DF$event == 1, DF$id, FUN = function(x) !cumsum(c(0, head(x, -1))))
这种方法使用plyr按
id
分割data.frame。然后分别处理event==0
和event==1
的情况,然后再合并处理。如果给定的id
值没有任何事件==1
行,则包括检查
require(plyr)
SelectRecords <- function( d ) {
eventIsZero <- which(d$event==0)
eventIsOne <- which(d$event==1)
if( length(eventIsOne) >= 1 )
selectedIndices <- c(eventIsZero, min(eventIsOne, na.rm=T))
else
selectedIndices <- eventIsZero
return( d[selectedIndices, ] )
}
ddply(ds, .variables="id", .fun=SelectRecords)
require(plyr)
选择记录
> DF
id status event ind
1 1 1 0 TRUE
2 1 1 1 TRUE
3 1 1 1 FALSE
4 2 0 0 TRUE
5 2 0 0 TRUE
6 2 0 0 TRUE
7 3 1 1 TRUE
8 3 1 1 FALSE
9 3 1 1 FALSE
require(plyr)
SelectRecords <- function( d ) {
eventIsZero <- which(d$event==0)
eventIsOne <- which(d$event==1)
if( length(eventIsOne) >= 1 )
selectedIndices <- c(eventIsZero, min(eventIsOne, na.rm=T))
else
selectedIndices <- eventIsZero
return( d[selectedIndices, ] )
}
ddply(ds, .variables="id", .fun=SelectRecords)