子集不是基于精确匹配,而是 R 中的部分

Posted

技术标签:

【中文标题】子集不是基于精确匹配,而是 R 中的部分【英文标题】:Subset not based on exact match, but partial in R 【发布时间】:2014-02-19 22:01:39 【问题描述】:

这是来自此处的后续问题: Subsetting a string based on pre- and suffix

当你有这个命令时:

    d <- subset(b, b$X %in% test)  

此命令在b$X 中查找与 test 完全匹配的所有内容。我怎样才能操纵它说它足以说明b$X 中的值包含test? IE。如果b$X 有一个值"something" 并且test"thing"。那我就认为这是一场比赛。

重要更新!测试有 512 个值,而不仅仅是示例中的 1。

【问题讨论】:

【参考方案1】:

子集中不需要 b$。

d <- subset(b, grepl(paste(test, collapse= "|"), X))

【讨论】:

解释一下您对原始代码所做的更改以及原因可能会有所帮助。这将使您的回答对未来的访问者更有用。【参考方案2】:

您可以将%in% 替换为grepl

# examples
x <- c("thing", "something", "some", "else")
test <- c("thing", "some")

# exact match
x %in% test
# [1]  TRUE FALSE  TRUE FALSE

# substring match (regex)
pattern <- paste(test, collapse = "|") # create regex pattern
grepl(pattern, x)
# [1]  TRUE  TRUE  TRUE FALSE

你的任务的整个命令:

d <- subset(b, grepl(paste(test, collapse= "|"), b$X))

"|" 表示正则表达式中的逻辑

【讨论】:

我可能误导了你。测试有 512 个不同的值。我猜为什么我得到“参数'模式'的长度> 1并且只使用第一个元素”? 非常感谢!它就像一个魅力。但是我仍然找不到我所有的512个名字,只有287个。经过精确测试,我发现只有256个。代码没有问题,它一定是别的...... 这里有点晚来帮助你@user3236594,但问题可能出在订单上。 grepl(paste(test, collapse= "|") 匹配 somethingsome 或 thing 或 some 或 something 但不匹配,“thing blah some”。在这种情况下,您需要执行 grepl(thing, b$x) &amp; grepl(some, b$x) 以使其正常工作。

以上是关于子集不是基于精确匹配,而是 R 中的部分的主要内容,如果未能解决你的问题,请参考以下文章

是否有一个 R 函数来匹配基于具有部分相似性的字符串的数据框列?

正则表达式匹配规则

关于字符串精确匹配

R:基于多个条件的两个数据帧的子集

R中的快速部分字符串匹配

Pandas str.contains 用于部分字符串的精确匹配