鉴于数据框:
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)
答案 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.无论如何你都必须处理它。