Sql R:用于多列中字符串的高效过滤器
我有一个名称的数据框(第一个和最后一个,有些大写,有些不大写)和与每个名称相关的分数:Sql R:用于多列中字符串的高效过滤器,sql,r,dplyr,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
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
和%中的%。然而,这返回:
[1] name score
<0 rows> (or 0-length row.names)
[1]姓名分数
(或长度为0的行名称)
而不是第1、2、3和4行<代码>名称|名称2
也不起作用。可能是因为我需要在name
和name2
列中执行strsplit()
或类似操作,然后重新组合。然而,这不是很优雅,而且我的df
实际上有数百万行,因此性能对我来说很重要。实现这一目标的最佳方式是什么 我们可以在
pat <- paste(c("mark","john","Long","briar"), collapse="|")
df %>%
filter_at(vars(matches('name')), any_vars(grepl(pat, ., ignore.case = TRUE)))
pat%
过滤变量(匹配('name')),任何变量(grepl(pat,,,ignore.case=TRUE)))
如果模式应该匹配两个列,那么将
任何变量
替换为所有变量
如果mydf
是sqlite表,这是否可行?这就是为什么我要避免使用grepl
,因为它不兼容。这是我指的链接:@战舰存在不兼容问题非常糟糕。如果要使用%in%,则可能需要使用separate
将列拆分为两列。顺便问一下,所有的L函数都可以使用哪些sqlite@warship根据链接,%like%
应该可以工作。如果您尝试过,那么仍然会存在与grepl
和SQL不兼容的问题:(我同意不兼容的问题,也许@hadley会看到这个问题并揭开谜底。。。