如何过滤包含特定模式的两个值之间的所有行,用于 R 中的数据框列表?

How to filter all rows between two values containing a certain pattern for a list of data frames in R?

我有一个包含大约一千个数据帧的大列表,我想过滤 Z 列中包含字符串模式 VALUE1 和 VALUE2 的两个值之间的所有行。基本上来自这样的数据帧:

weight | height | Z
---------------------------
62      100      NA
65      89       NA
59      88       randomnumbersVALUE1randomtext
66      92       NA
64      90       NA
64      87       randomnumbersVALUE2randomtext
57      84       NA

我想要这样的数据框:

59      88       randomnumbersVALUE1randomtext
66      92       NA
64      90       NA
64      87       randomnumbersVALUE2randomtext

这样,Z 列中包含字符串模式“VALUE1”的值之前和 Z 列中包含字符串模式“VALUE2”的值之后的 na 值将被过滤掉。我试过这样的代码,但没有成功:

for(i in 1:length(df)){
  df[[i]] <- filter(df[[i]], between(Z, grep("VALUE1", Z), grep("VALUE2", Z)))
}

还有一个额外的问题,如果我的数据框有多个相似的 sequences/occasions,其中 Z 列有一个包含 VALUE1 和 VALUE2 的字符串模式(只有这两个模式很重要),那么我如何过滤所有的那些之间的行也是..?例如:

weight | height | Z
---------------------------
62      100      NA
65      89       NA
59      88       randomnumbersVALUE1randomtext
66      92       NA
64      90       NA
64      87       randomnumbersVALUE2randomtext
57      84       NA
68      99       NA
59      82       NA
60      87       srebmunmodnarVALUE1txetmodnar
61      86       NA
63      84       srebmunmodnarVALUE2txetmodnar

过滤后我会得到:

59      88       randomnumbersVALUE1randomtext
66      92       NA
64      90       NA
64      87       randomnumbersVALUE2randomtext
60      87       srebmunmodnarVALUE1txetmodnar
61      86       NA
63      84       srebmunmodnarVALUE2txetmodnar

假设每个 data.frame 都有一个开始和结束值。如果没有,你可以通过特殊处理修改这个

lapply(df, function(x){
       start <- which(grepl("VALUE1", x$z))
       end   <- which(grepl("VALUE2", x$z))
       rows  <- unlist(lapply(seq_along(start), function(y){start[y]:end[y]}))
       return(df[rows,])})