达到目标时删除以下观察

时间:2016-02-16 13:38:19

标签: r dataframe

鉴于数据框:

df = data.frame(
  ID = c(1,1,1,1,2,3,3),
  Start = c(0,8,150,200,6,7,60),
  Stop = c(5,60,170,210,NA,45,80))


  ID  Start Stop Dummy
1  1     0    5     0
2  1     8   60     1
3  1   150  170     1
4  1   200  210     1
5  2     6   NA     0
6  3     7   45     0
7  3    60   80     1

对于每个ID,我希望将所有行保留到Start[i+1] - Stop[i] >= 28,然后删除该ID的以下观察

在此示例中,输出应为

   ID Start Stop Dummy
1  1     0    5     0
2  1     8   60     1
5  2     6   NA     0
6  3     7   45     0
7  3    60   80     1

我最终必须将NA设置为稍后容易识别的值,并且以下代码

df$Stop[is.na(df$Stop)] = 10000
df$diff <- df$Start-c(0,df$Stop[1:length(df$Stop)-1])
space <- with(df, unique(ID[diff<28]))
df2 <- subset(df, (ID %in% space & diff < 28) | !ID %in% space)

3 个答案:

答案 0 :(得分:1)

使用data.table ...

@Assert\File

library(data.table) setDT(df) df[,{ w = which( shift(Start,type="lead") - Stop >= 28 ) if (length(w)) .SD[seq(w[1])] else .SD }, by=ID] # ID Start Stop # 1: 1 0 5 # 2: 1 8 60 # 3: 2 6 NA # 4: 3 7 45 # 5: 3 60 80 是与每个.SD组关联的数据子集。

答案 1 :(得分:0)

p <- which(df$Start[2:nrow(df)]-df$Stop[1:(nrow(df)-1)] >= 28)
df <- df[p,]

假设您希望保留下一个条目开始的条目,如果高于giben条目停止28或更多

结果是:

>p 2 3 
> df[p,]
  ID Start Stop
2  1     8   60
3  1   150  170

从第2行开始(i + 1 = 2)高于第1行(i = 1)中的停止90.

或者,如果通过直到表示反向条件,那么

df <- df[which(df$Start[2:nrow(df)]-df$Stop[1:(nrow(df)-1)] < 28),]

在您的数据框中包含NA让我思考。你如何说出自己的状况,你必须非常小心。如果你想保留下一个开始和结束之间的差异小于28的所有情况,那么上面的语句就可以了。 但是,如果您希望在差异为28或更大时保持所有情况除外,那么您应该

p <- which((df$Start[2:nrow(df)]-df$Stop[1:(nrow(df)-1)] >= 28))
rp <-  which((!is.element(1:nrow(df),p)))
df <- df[rp,]

因为它将包括未知的差异。

答案 2 :(得分:0)

创建差异列。

df$diff<-df$Start-c(0,df$Stop[1:length(df$Stop)-1])

基于此列的子集

df[df$diff<28,]

PS:我已经将'NA'转换为0.无论如何你都必须处理它。