2015-12-23 60 views
2

我試圖完成與this question中解決的目標相同的目標,但我想通過兩個 grep語句過濾表。當我試試這個:基於MULTIPLE正則表達式匹配的數據表的過濾內容

DT[grep("word1", column) | grep("word2", column)] 

我得到這個錯誤:

Warning message: 
In grep("word1", column) | grep("word2", column) : 
longer object length is not a multiple of shorter object length 

,當我嘗試這個邏輯與分配新建分配FY :=在data.table的j參數組合,我得到各種怪異。基本上,顯然OR運營商|不適用於grep在data.table的參數i中。

我想出了一個解決辦法凌亂:

DT.a <- DT[grep("word1", column)] 
DT.b <- DT[grep("word2", column)] 
DT.all <- rbind(DT.a,DT.b) 

但我希望有一個更好的方式來實現這一目標。有任何想法嗎?

+4

也許只是使用'grepl',而不是'grep'? – nicola

+2

我不確定你爲什麼會收到警告,但你應該可以用單個'grep'語句'DT [grep(「word1 | word2」,column)]'來做到這一點。或者像@nicola建議的那樣對'grepl'做同樣的事情。 – eipi10

+0

@ eipi10其實他沒有得到一個錯誤,而是一個警告。無論如何,'grep'返回索引,而'grepl'返回一個邏輯向量('grep'是'which(grepl())'')的一種。所以他將'|'應用於整數矢量(可能長度不同,因爲每個單詞可能出現不同的次數)。 – nicola

回答

2

這裏的問題原來是功能選擇和OR運算符|的位置語法的組合。因爲每個grep()都返回索引(整數)的向量,根據數據它們可能具有不同的長度,data.table包不是用來處理這種輸入的。 grepl()是一個更合適的函數,因爲它返回是否存在正則表達式匹配的布爾值,並且OR運算符|應放置在正則表達式模式字符串中。

解決方案:

DT[grepl("word1|word2", column)]