R 删除数据框中所有在行中值之前的行

R 删除数据框中所有在行中值之前的行,r,dataframe,row,subset,R,Dataframe,Row,Subset,考虑df1: df <- data.frame(time = c(1,2,3,4,5,6,7,8,9,10), marker = c(NA,NA,NA,"stop",NA,NA,NA,"start",NA,NA), behaviour = c("Rest","Rest","Rest","Rest","Awake","Awake","Awake","Awake","Awake","Rest")) time marker behaviour 1 1 <NA>

考虑
df1

df <- data.frame(time = c(1,2,3,4,5,6,7,8,9,10), marker = c(NA,NA,NA,"stop",NA,NA,NA,"start",NA,NA), behaviour = c("Rest","Rest","Rest","Rest","Awake","Awake","Awake","Awake","Awake","Rest"))

   time marker behaviour
1     1   <NA>      Rest
2     2   <NA>      Rest
3     3   <NA>      Rest
4     4   stop      Rest
5     5   <NA>     Awake
6     6   <NA>     Awake
7     7   <NA>     Awake
8     8  start     Awake
9     9   <NA>     Awake
10   10   <NA>      Rest

我们可以使用数字索引来子集行

i1 <- with(df, which(marker %in% c("stop", "start")))
df[-((i1[1]+1):(i1[2]-1)),]

i1
dfA
cumsum
解决方案(我也使用
data.table
,但您不必这样做),它概括为多个
stop/start
值:

library(data.table)
dt <- as.data.table(df)

dt[, drop := list(cumsum(marker=="stop" & !is.na(marker)) - 
                    cumsum(marker=="start" & !is.na(marker)))][drop==0 | marker == "stop"]

   #    time marker behaviour drop
   # 1:    1     NA      Rest    0
   # 2:    2     NA      Rest    0
   # 3:    3     NA      Rest    0
   # 4:    4   stop      Rest    1
   # 5:    8  start     Awake    0
   # 6:    9     NA     Awake    0
   # 7:   10     NA      Rest    0
库(data.table)

dt Try
i1是的,这是一种享受,谢谢你!
grp <- with(df, c(0, head(cumsum(marker == "stop" & !is.na(marker)),-1)))
df[with(df, ave(marker == "start" & !is.na(marker),
             grp, FUN = function(x) !any(x)|cumsum(x)>0)),]
#   time marker behaviour
#1     1   <NA>      Rest
#2     2   <NA>      Rest
#3     3   <NA>      Rest
#4     4   stop      Rest
#8     8  start     Awake
#9     9   <NA>     Awake
#10   10   <NA>      Rest
df <- data.frame(time = c(1,2,3,4,5,6,7,8,9,10), marker = c("NA","NA","NA","stop","NA","NA","NA","start","NA","NA"), behaviour = c("Rest","Rest","Rest","Rest","Awake","Awake","Awake","Awake","Awake","Rest"))

df1 <- as.integer(row.names(df[df$marker=="stop",]))+1
df2 <- as.integer(row.names(df[df$marker=="start",]))-1
ans <- df[-(df1:df2),]
library(data.table)
dt <- as.data.table(df)

dt[, drop := list(cumsum(marker=="stop" & !is.na(marker)) - 
                    cumsum(marker=="start" & !is.na(marker)))][drop==0 | marker == "stop"]

   #    time marker behaviour drop
   # 1:    1     NA      Rest    0
   # 2:    2     NA      Rest    0
   # 3:    3     NA      Rest    0
   # 4:    4   stop      Rest    1
   # 5:    8  start     Awake    0
   # 6:    9     NA     Awake    0
   # 7:   10     NA      Rest    0