2017-10-15 32 views
0

我有名称的数据帧为字符串高效过滤器(第一个和最后,有些是大写一些都没有)以及与每个名称相关联的分数:R:在多列

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也没有工作。也许这是因为我需要在namename2列上做一个strsplit()或类似的东西,然后重新组合。然而,这不是很优雅,我的df实际上是数百万行,所以对我来说性能很重要。什么是完成这个最好的方法?

回答

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_varsall_vars

+0

想,如果我的'df'是SQLite表这项工作?这就是为什么我想避免使用'grepl',因为它不兼容。这是我指的链接:https://stackoverflow.com/questions/27468166/grepl-for-dplyr-sql-table – warship

+2

@军舰这是非常糟糕的,有不兼容的问题。如果你想在%中使用%,那么你可能需要使用'separate'分割成两列。顺便说一句,alll的功能将与sqlite – akrun

+0

@ warship基于链接'%like%'应该工作。你有没有尝试 – akrun