【问题标题】:R - Find if characters of a vector are in another vectorR - 查找向量的字符是否在另一个向量中
【发布时间】:2020-09-17 07:45:02
【问题描述】:

我有一个与此主题非常相似的疑问:Find matches of a vector of strings in another vector of strings。

我有一个客户向量,如果名称表明它是商业客户,我需要更改我的 data.frame 中的类型。

所以,假设:

commercial_names <- c("BAKERY","MARKET", "SCHOOL", "CINEMA")
clients <- c("JOHN XX","REESE YY","BAKERY ZZ","SAMANTHA WW")

我尝试了之前引用的主题中的代码,但出现错误:

> grepl(paste(commercial_names, collape="|"),clients)
[1] TRUE TRUE TRUE TRUE
Warning message:
In grepl(paste(commercial_names, collape = "|"), clients) :
  argument 'pattern' has length > 1 and only the first element will be used

我做错了什么?我会感谢任何帮助。

【问题讨论】:

  • 你想得到什么确切的输出?
  • 我想验证clients 中的哪一个有商业名称。所以我想得到:FALSE FALSE TRUE FALSE

标签: r


【解决方案1】:

我找到了另一种方法,使用包data.table的命令%like%:

> clients %like% paste(commercial_names,collapse = "|")
[1] FALSE FALSE  TRUE FALSE

【讨论】:

    【解决方案2】:

    您的代码是正确的,但有一个错字:

    grepl(paste0(commercial_names, collapse = "|"), clients) # typo: collape
    [1] FALSE FALSE  TRUE FALSE
    

    鉴于错字,commercial_names 没有折叠。

    【讨论】:

      【解决方案3】:

      你也可以这样做:

      clients.first <- gsub(" ..", "", clients)
      clients.first %in% commercial_names
      

      这会返回:

      [1] FALSE FALSE  TRUE FALSE
      

      如果您的客户数据更加异构,您可能需要更改 gsub 的正则表达式。

      【讨论】:

        【解决方案4】:

        不知道如何使用单线执行此操作,但循环似乎可以解决问题。

        sapply(clients, function(client) {
          any(str_detect(client, commercial_names))
        })
        > JOHN XX    REESE YY   BAKERY ZZ SAMANTHA WW 
        > FALSE       FALSE        TRUE       FALSE 
        
        

        【讨论】:

        • 太好了,谢谢!我试图用apply 来做这件事,但我不知道如何正确使用这一系列函数(apply、lapply、sapply、mapply)。
        • 学习lapply 和sapply 会让你的生活轻松很多。 lapply 与 apply 执行相同的操作,方法是循环遍历向量而不是行/列。 sapply 类似于 lapply,但也会尝试简化输出。
        猜你喜欢
        • 1970-01-01
        • 2018-04-24
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        • 2013-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多