我有一个名字的数据框(第一个和最后一个,有些是大写的,有些不是)和与每个名字相关的分数:
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
实际上是数百万行,所以性能在我的情况下很重要。完成此任务的最佳方法是什么?
答案 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