首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在R中使用向量进行grep精确匹配?

如何在R中使用向量进行grep精确匹配?
EN

Stack Overflow用户
提问于 2021-04-08 15:45:58
回答 3查看 54关注 0票数 1

我有一个很大的数据框,我想要根据列值提取行。我的问题是grep将接受该值的所有实例(例如,如果我想grep“1”,则将接受"11“)。如何获取精确匹配?下面的例子简单地说明了我的问题。我只想grep "metm1“行,但是它正在grep所有的行,即使它们不是完全匹配的。

代码语言:javascript
运行
复制
## 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), ])
EN

回答 3

Stack Overflow用户

发布于 2021-04-08 15:50:24

您可以在搜索词周围放置^$锚点,以强制进行精确匹配:

代码语言:javascript
运行
复制
regex <- paste0("^(?:", paste(mets, collapse = "|"), ")$")
new_df <- as.data.frame(df1[grep(regex, df1$met, fixed=TRUE), ])

作为参考,这里使用的正则表达式模式:

代码语言:javascript
运行
复制
^(?:metm1)$
^(?:metm1|metm2|metm3)$   <-- for multiple terms
票数 1
EN

Stack Overflow用户

发布于 2021-04-08 16:45:46

您可以简单地使用==来进行精确匹配。

代码语言:javascript
运行
复制
df1[df1$met == mets,]
#    met   dt1
#2 metm1 0.777
#3 metm1  0.99

如果mets不止一个元素,请使用%in%,就像@MrFlick在评论中指出的那样。

代码语言:javascript
运行
复制
df1[df1$met %in% mets,]
#    met   dt1
#2 metm1 0.777
#3 metm1  0.99
票数 1
EN

Stack Overflow用户

发布于 2021-04-08 16:15:52

另一种解决方案是使用边界锚点\\b

代码语言:javascript
运行
复制
df1[grep(paste0("\\b(", paste0(mets, collapse = "|"),")\\b"), df1$met), ]
    met   dt1
2 metm1 0.777
3 metm1  0.99

使用dplyr时,您可以使用grepl执行filter,它返回TRUEFALSE,而grep返回匹配索引:

代码语言:javascript
运行
复制
library(dplyr)
df1 %>%
  filter(grepl(paste0("\\b(", paste0(mets, collapse = "|"),")\\b"), met))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66999448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档