我有一个很大的数据框,我想要根据列值提取行。我的问题是grep将接受该值的所有实例(例如,如果我想grep“1”,则将接受"11“)。如何获取精确匹配?下面的例子简单地说明了我的问题。我只想grep "metm1“行,但是它正在grep所有的行,即使它们不是完全匹配的。
## make data
df1 <- data.frame(matrix(, nrow=4, ncol=2))
colnames(df1) <- c("met", "dt1")
df1$met <- c("metm11", "metm1", "metm1", "metm12")
df1$dt1 <- c("0.666", "0.777", "0.99", "0.01")
# make list for grep
mets <- "metm1"
# grep
new_df <- as.data.frame(df1[grep(paste(mets, collapse = "|"), df1$met), ])
发布于 2021-04-08 15:50:24
您可以在搜索词周围放置^
和$
锚点,以强制进行精确匹配:
regex <- paste0("^(?:", paste(mets, collapse = "|"), ")$")
new_df <- as.data.frame(df1[grep(regex, df1$met, fixed=TRUE), ])
作为参考,这里使用的正则表达式模式:
^(?:metm1)$
^(?:metm1|metm2|metm3)$ <-- for multiple terms
发布于 2021-04-08 16:45:46
您可以简单地使用==
来进行精确匹配。
df1[df1$met == mets,]
# met dt1
#2 metm1 0.777
#3 metm1 0.99
如果mets
不止一个元素,请使用%in%
,就像@MrFlick在评论中指出的那样。
df1[df1$met %in% mets,]
# met dt1
#2 metm1 0.777
#3 metm1 0.99
发布于 2021-04-08 16:15:52
另一种解决方案是使用边界锚点\\b
df1[grep(paste0("\\b(", paste0(mets, collapse = "|"),")\\b"), df1$met), ]
met dt1
2 metm1 0.777
3 metm1 0.99
使用dplyr
时,您可以使用grepl
执行filter
,它返回TRUE
和FALSE
,而grep
返回匹配索引:
library(dplyr)
df1 %>%
filter(grepl(paste0("\\b(", paste0(mets, collapse = "|"),")\\b"), met))
https://stackoverflow.com/questions/66999448
复制相似问题