2017-10-15 4 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

パターンは私の `df`がsqliteのテーブルであればall_vars

+0

でしょう。この作品でany_varsを交換、その後、列の両方に一致する必要がある場合我々はfilter_at

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

で試すことができますか?これは互換性がないので 'grepl'の使用を避けたいのです。これは私が参照しているリンクです:https://stackoverflow.com/questions/27468166/grepl-for-dplyr-sql-table – warship

+2

@warship互換性の問題があることは非常に悪いです。 %in%を使用する場合は、 'separate'を使用して2つの列に分割する必要があります。すべての関数がsqliteで動作するBTW – akrun

+0

@warshipリンクに基づいて、 '%like%'は動作するはずです。あなたが試みたことがあります – akrun

関連する問題