如何在纵向数据框中指出第一个事件观察并删除其余事件观察?

时间:2014-01-21 04:33:27

标签: 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      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    

有人有好主意吗? 非常感谢!!

2 个答案:

答案 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==0event==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)