嗨我有一个如下数据框:
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
或
id status event
1 1 0
1 1 1
2 0 0
2 0 0
2 0 0
3 1 1
有人有好主意吗? 非常感谢!!
答案 0 :(得分:3)
如果DF
是输入数据框,则:
DF$ind <- ave(DF$event == 1, DF$id, FUN = function(x) !cumsum(c(0, head(x, -1))))
在示例的情况下,它给出了:
> 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
答案 1 :(得分:0)
此方法使用plyr按id
拆分data.frame。然后,event==0
和event==1
的情况将分开处理,然后合并。如果给定的event==1
值没有任何id
行,则会包含一项检查。
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)