如何过滤包含特定模式的两个值之间的所有行,用于 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,])})
我有一个包含大约一千个数据帧的大列表,我想过滤 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,])})