【问题标题】:How to check if string (fully or partly) matches values on all columns of dataframe?如何检查字符串(完全或部分)是否与数据框所有列上的值匹配?
【发布时间】:2021-08-12 11:19:34
【问题描述】:

我有一个数据框:

x1               x2 
value           12
john and bob    45
another         87

我想检查所有值中是否有字符串“bob”。我想要一个函数,它将接受数据帧和字符串名称,并将为此数据帧返回 TRUE。 apply(df, 1, function(r) any(r == "bob")) 需要完全匹配,所以它不起作用,例如:

x1               x2 
value           12
johnandbob      45
another         87

它还为数据帧中的每个值返回 TRUE\FALSE,所以如果我有百万个值,就会有百万个 TRUE\FALSE。但是我只需要其中一个是否有必要的价值。该怎么做?

【问题讨论】:

    标签: r dataframe function


    【解决方案1】:

    使用grepl 进行部分匹配,使用any 仅获取一个值。

    any(grepl('bob', df$x1))
    #[1] TRUE
    

    这也将为'bobby''ambob' 等值返回TRUE。如果您希望它完全匹配,请使用它们周围的字边界 (\\b)。

    any(grepl('\\bbob\\b', df$x1))
    

    【讨论】:

    • 谢谢,一旦找到它会停止搜索吗?还是会检查所有这些?我有数以千万计的行和许多列的数据框,所以我需要一旦找到一个匹配项就会停止搜索的算法。否则需要几个小时
    • 嗯,R 是一种矢量化语言。所以像grepl 这样的函数可以同时作用于整个列。您可以编写一个for 循环来逐个执行此操作,并在找到字符串时停止,但这将比当前答案效率低得多。如果这个解决方案真的很慢,那么您可能需要在Rcpp 中编写循环,这可能会使其更快。
    【解决方案2】:

    我们可以使用来自stringr 包的str_detect

    library(dplyr)
    library(stringr)
    df %>% 
        mutate(across(everything(), ~str_detect(., "bob")))
    

    输出:

      x1    x2   
      <lgl> <lgl>
    1 FALSE FALSE
    2 TRUE  FALSE
    3 FALSE FALSE
    

    或者对于df的一列

    any(str_detect(df$x1, "bob"))
    

    输出:

    [1] TRUE
    

    【讨论】:

    • 谢谢,一旦找到它会停止搜索吗?还是会检查所有这些?我有数以千万计的行和许多列的数据框,所以我需要一旦找到一个匹配项就会停止搜索的算法。否则需要几个小时
    • 试试这个library(stringi) stri_match_first_regex(df1$x1, "bob")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多