子集不是基于精确匹配,而是 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) & grepl(some, b$x)
以使其正常工作。以上是关于子集不是基于精确匹配,而是 R 中的部分的主要内容,如果未能解决你的问题,请参考以下文章