【问题标题】:Subset not based on exact match, but partial in R子集不是基于精确匹配,而是 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。

【问题讨论】:

    标签: regex r substring


    【解决方案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) 以使其正常工作。
    猜你喜欢
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2016-10-18
    相关资源
    最近更新 更多