R:对多列中的字符串进行有效过滤

时间:2017-10-15 04:51:58

标签: sql r dplyr

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

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

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

    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也不起作用。也许是因为我需要在strsplit()name列上执行name2或类似的操作,然后重新组合。但是,这不是很优雅,我的df实际上是数百万行,所以性能在我的情况下很重要。完成此任务的最佳方法是什么?

1 个答案:

答案 0 :(得分: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