2014-07-22 12 views
2

dplyr是唯一可以處理我的843k data.frame並以快速查詢的軟件包。 我可以使用一些數學和平等標準過濾罰款,但是我需要實現一個概念的搜索。dplyr包:如何使用類似'%xyz%'的SQL語法來查詢大型數據框?

我需要的是這樣的sqldf查詢

library(sqldf) 
head(iris) 
sqldf("select * from iris where lower(Species) like '%nica%'") 

在dplyr幫助,我無法找到我怎麼能做到這一點。例如:

filter(iris,Species like '%something%') 

開始和結束%非常重要。另請注意,數據幀有800 + k行,所以傳統的R函數可能運行緩慢。它必須是一個基於dplyr的解決方案。

+4

'dplyr是唯一可以處理我843k data.frame'的軟件包 - 我強烈建議R package'數據。 table'。 – nrussell

+1

我做出了關注dplyr語法和「跳過data.table」的決定。我的整個應用程序已提交給dplyr,因此data.table解決方案可以,但本機dplyr是最好的。我認爲dplyr是在引擎蓋下使用data.table。 – userJT

+0

'dplyr'可以與數據表一起工作,但除非您明確加載'data.table'並將data.frames轉換爲data.tables,否則它不會在底層使用它。這樣做可能會增加額外的速度。 – Gregor

回答

5

這個什麼 -

library(dplyr) 
data(iris) 
filter(iris, grepl("nica",Species)) 

編輯:另一種選擇 - 在data.table()功能%like%

library(dplyr) 
data(iris) 
## 
Iris <- iris[ 
    rep(seq_len(nrow(iris)),each=5000), 
    ] 
dim(Iris) 
[1] 750000  5 
## 
library(microbenchmark) 
library(data.table) 
## 
Dt <- data.table(Iris) 
setkeyv(Dt,cols="Species") 
## 
foo <- function(){ 
    subI <- filter(Iris, grepl("nica",Species)) 
} 
## 
foo2 <- function(){ 
    subI <- Dt[Species %like% "nica"] 
} 
## 
foo3 <- function(){ 
    subI <- filter(Iris, Species %like% "nica") 
} 
Res <- microbenchmark(
    foo(),foo2(),foo3(), 
    times=100L) 
## 
> Res 
Unit: milliseconds 
    expr  min  lq median  uq  max neval 
    foo() 114.31080 122.12303 131.15523 136.33254 214.0405 100 
foo2() 23.00508 30.33685 39.77843 41.49121 129.9125 100 
foo3() 18.84933 22.47958 29.39228 35.96649 114.4389 100 
+0

這太好了。所以最後,dplyr是最快的。最終的答案是:過濾器(虹膜,物種%像%「尼卡」)。如何在data.table中尋找%like%函數的幫助? – userJT

+0

是的,我相信 - 雖然,正如我所說的,我不是'data.table'的專家,我有一種感覺,'foo2()'正在做矢量掃描而不是二進制搜索,所以可能會出現一個更快的方法。無論如何,在'foo3()'中''like%''使用'filter'看起來相當快。 (在'library(data.table)'之後,如果你使用的是RStudio,你可以在幫助頁面的搜索欄中輸入'%like%',或者從你的控制檯類型'?'%%'%'中輸入。% – nrussell

+0

%like%實際上只是grepl的封裝,所以只要grepl可能是最簡單的 – userJT

2

完整的代碼是(包括小寫)

require(data.table) 
iris %>% filter(tolower(Species) %like% 'nica') 
相關問題