【问题标题】:R: efficient filter for character strings in multiple columnsR:多列字符串的高效过滤器
【发布时间】:2018-03-26 21:11:55
【问题描述】:

我有一个名称数据框(名字和姓氏,有些是大写的,有些不是)和与每个名字相关的分数:

df = data.frame(name = c("Mark Johnson","John Roberts","Sue mcguire","kat Long","dan Scott"), name2 = c("sam marks", "Mark Jones", "tim briar", "jonas Stark", "Mike Robinson"), score = c(2,3,4,5,5))

  name             name2         score
1 Mark Johnson     sam marks     2
2 John Roberts    Mark Jones     3
3  Sue mcguire     tim briar     4
4     kat Long   jonas Stark     5
5    dan Scott Mike Robinson     5

我希望能够仅通过包含 either 列中的名字或姓氏来过滤我的数据框,例如:

    df %>% filter(name %in% c("mark","john","Long","briar"))

我想避免使用grepl,而是使用filter 和%in%。但是,这会返回:

[1] name  score
<0 rows> (or 0-length row.names)

而不是第 1、2、3 和 4 行。name|name2 也不起作用。也许是因为我需要在name 和name2 列上执行strsplit() 或类似的操作,然后重新组合。但是,这不是很优雅,我的 df 实际上是数百万行,所以对我来说性能很重要。实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: sql r dplyr


    【解决方案1】:

    我们可以试试filter_at

    pat <- paste(c("mark","john","Long","briar"), collapse="|")
    df %>% 
       filter_at(vars(matches('name')), any_vars(grepl(pat, ., ignore.case = TRUE)))
    

    如果模式应该匹配两列,则将any_vars 替换为all_vars

    【讨论】:

    • 如果我的 df 是一个 sqlite 表,这会起作用吗?这就是为什么我想避免使用grepl,因为它不兼容。这是我指的链接:stackoverflow.com/questions/27468166/grepl-for-dplyr-sql-table
    • @warship 存在不兼容问题非常糟糕。如果要使用 %in%,则可能需要使用 separate 拆分最多两列。顺便说一句,所有函数都可以与 sqlite 一起使用
    • @warship 根据链接,%like% 应该可以工作。你试过了吗
    • 是的,grepl 和 SQL 仍然不兼容 :(
    • 我同意不兼容的问题,也许@hadley 会看到这个问题并揭秘......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2018-06-17
    相关资源
    最近更新 更多