2015-09-28 28 views
4

假設我有以下幾點:dplyr過濾器()類似於SQL的通配符%%

library(dplyr) 
foo <- data.frame(Company = c("company1", "foo", "test", "food"), Metric = rnorm(4, 10)) 
> foo 
    Company Metric 
1 company1 10.539970 
2  foo 9.487823 
3  test 9.663994 
4  food 9.499327 

爲什麼foo %>% dplyr::filter(Company %like% "%foo%")返回0的結果嗎? (而不是第2和第4行)我試圖在dplyr::filter的特定輸入字符串上使用SQL等效的通配符過濾器。

我在做什麼錯?

+5

使用你如何'%樣%'工作?這是一個自定義函數還是來自另一個包的函數? –

+0

@KonradRudolph Plz請參閱下面的答案。我將它更改爲'foo%>%dplyr :: filter(公司%,例如%「foo」)',它可以工作。 – Ray

+2

'like'來自'data.table'包 –

回答

5

您可以使用:

filter(foo, grepl("foo", Company, fixed = TRUE)) 

輸出:

Company Metric 
1  foo 9.906805 
2 food 10.464493 

由於Dhawal卡皮爾指出,我認爲%like%data.table

library(data.table) 
DT <- data.table(foo) 
DT[Company %like% 'foo'] 

輸出:

Company Metric 
1:  foo 9.906805 
2: food 10.464493 
+0

@Richard Scriven謝謝編輯 – mpalanco

+0

當然。只是讓它更快一點 –

3

想通了;圖中的情況下,它可以幫助別人,將來我會離開這件事:

foo <- foo %>% dplyr::filter(Company %like% "foo") 

沒有圍繞foo" S IN原來的問題,返回正確的data.frame。仍然不確定您是否可以使用%作爲SQL中的錨點(例如%foofoo%),但上述方法適用於我需要的操作。

+10

沒有人知道你從哪裏得到'%like%',btw –

+1

'grepl()'不會被轉換爲SQL,它只能用於數據框。在數據庫後端使用dplyr時,'%like%'很有用。在數據庫中進行過濾對於大型表非常有用,該表過大而無法完全加載到R.您可以通過調用'explain()'函數來查看'dplyr'生成的SQL語句。 'foo%>%filter(公司%,比如%「foo」)%>%explain()'。 –

1

您可以使用庫(stringr)

library(dplyr) 
library(stringr) 
foo <- data.frame(Company = c("company1", "foo", "test", "food"), Metric = rnorm(4, 10)) 

foo %>% filter(str_detect(Company,"foo")) 

以及任何其他正則表達式

foo %>% filter(str_detect(Company,"^f"))