【问题标题】:Filter only rows that contain exact two strings in a column仅过滤一列中包含两个字符串的行
【发布时间】:2021-12-24 23:14:11
【问题描述】:

我有一个如下的data.frame:

df = data.frame(sp_name = c("Xylopia brasiliensis", "Xylosma tweediana", "Zanthoxylum fagara subsp. lentiscifolium", "Schinus terebinthifolia var. raddiana", "Eugenia"), value = c(1, 2, 3, 4, 5))

这是交易:我只对 df 中包含恰好两个词(在我的例子中是 Xylopia brasiliensis 和 Xylosma tweediana)的行进行子集化/过滤感兴趣。我该如何进行?我在使用tidyverse 中的filter 函数时失败了

已经谢谢了。

【问题讨论】:

    标签: r string filter tidyverse subset


    【解决方案1】:

    我们可以使用str_count在filter中创建一个逻辑向量

    library(dplyr)
    library(stringr)
    df %>% 
        filter(str_count(sp_name, "\\w+") == 2)
    

    -输出

                   sp_name value
    1 Xylopia brasiliensis     1
    2    Xylosma tweediana     2
    

    或者这也可以使用str_detect 来完成 - 从开头 (^) 匹配单词 (\\w+),后跟一个空格,最后是另一个单词 (\\w+) ($) ) 的字符串

    df %>%
        filter(str_detect(sp_name, "^\\w+ \\w+$"))
    

    或者在base R 和grep

    subset(df, grepl("^\\w+ \\w+$", sp_name))
                   sp_name value
    1 Xylopia brasiliensis     1
    2    Xylosma tweediana     2
    

    【讨论】:

    • 我明白了! \\w+ 表示我想要匹配?
    • @hiperhiper 如果您检查?regex The symbol \w matches a ‘word’ character。 + 是匹配一个或多个单词字符。如果我单独使用\\w,它将仅匹配 Xylopia 中的“X”。基本上,它要求匹配 grepl 或 str_detect 中从字符串开头到结尾的两个单词。所有其他多于或少于两个单词的元素都不会返回 TRUE
    • 哦,我明白了。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多