【问题标题】:Checking if string contains all elements from vector? (R, dataframes, dplyr)检查字符串是否包含向量中的所有元素? (R,数据帧,dplyr)
【发布时间】:2017-10-27 22:00:40
【问题描述】:

我有一个数据框,其中有一个名为 names 的列存储字符串

姓名 '安娜,玛丽' '约翰,多伊' “斯图尔特,马修斯”

我有一个以未知顺序存储名称的向量。例如,

v <- c('Ana', 'Mari')
v <- c('Mari', 'Ana')

我想过滤包含向量中所有元素的所有单元格。有谁知道可以做到这一点的功能吗?

到目前为止,我有这个,但它正在检查单元格中是否包含单元格中的任何元素(不要介意包含与向量不匹配的额外元素的单元格,但向量中的所有元素都应该包含在单元格中)。

df &lt;- df %&gt;% filter(grepl(vector, col_name))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:
    library(tidyverse) 
    library(stringr)
    
    df = data_frame(name = c('Ana, Mari','John, Doe', 'Stuart, Matthews'))
    v <- c('Mari', 'Ana')
    

    基础R:

    df[sapply(strsplit(df$name, split=", "), function(str) all(v %in% str)), ]
    
           name
    1 Ana, Mari
    

    tidyverse:

    df %>%
      group_by(name) %>%
      filter(all(v %in% str_split(name, ", ", simplify=TRUE)))
    
           name
    1 Ana, Mari
    

    【讨论】:

      【解决方案2】:

      你可以的

      df %>% filter(rowSums(mapply(grepl, x=list(name), pattern=v))==length(v))
      

      【讨论】:

        【解决方案3】:

        我们可以使用str_detect 和filter

        library(tidyverse)
        df %>% 
             filter(str_detect(df$name, paste(v, collapse="|")))
        # A tibble: 1 x 1
        #       name
        #      <chr>
        #1 Ana, Mari
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-03
          • 1970-01-01
          • 1970-01-01
          • 2010-10-04
          • 2017-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多