2013-10-29 31 views
2

我最近開始使用data.table包來識別符合某些條件的表列中的值。儘管我已經完成了大部分工作,但現在我仍然堅持這個問題:將data.table列的每個組中的值與向量中的值匹配

我有一個數據表table1,其中第一列(標籤)是組ID,第二列,o.cell,是一個整數。關鍵是「標籤」

我有另一個數據表,表2,包含單個列:「單元格」。

現在,我正試圖爲table1中的每個組找到table2中「cell」列中列「o.cell」的值。 table1有大約400K行被分成800多組不等大小。 table2有大約130萬行獨特的細胞數量。 「o.cell」table1列中的單元格編號可以在多個組中找到。

這似乎是一個簡單的任務,但我找不到正確的方法來做到這一點。根據我構建我的調用的方式,它要麼給我的結果與我期望的不同,要麼永遠不會完成,而且我必須結束R任務,因爲它凍結了(我的機器具有24 GB RAM)。

這裏的「變種」的電話我都試過的一個示例:

overlap <- table1[, list(over.cell = 
       o.cell[!is.na(o.cell) & o.cell %in% table2$cell]), 
       by = labels] 

我很肯定這是使用數據表的這個任務,重要的是我能頂走錯了路沒有得到我想要的結果。

我將非常感謝任何幫助。謝謝。

+5

您好,歡迎SO。爲了提供一個可重複的例子,你可以使用'reproduce()' - 該函數是'data.table'知道&指令在這裏:http://bit.ly/SORepro - [如何使一個偉大的R可重現例如](http://bit.ly/SORepro) –

+0

你在一個(很小)的情況下運行了一些測試來檢查你的代碼是否正確?很難說當你在400k行上執行操作時會發生什麼...... – digEmAll

+1

在黑暗中拍攝:在做分組業務之前只需標記列:'setkey(table1,o.cell);表1 [J(表2 $細胞),isin2:= TRUE]'。然後你可以做'table2 [isin2,{做一些有用的事情},by = labels]'。如果你的表格很大,你可能想避免用'<-' – Frank

回答

0

聽起來這是您的設置:

dt1 = data.table(labels = c('a','b'), o.cell = 1:10) 
dt2 = data.table(cell = 4:7) 

你只想做一個簡單的合併:

setkey(dt1, o.cell) 
dt1[dt2] 
# o.cell labels 
#1:  4  b 
#2:  5  a 
#3:  6  b 
#4:  7  a 
相關問題