2012-12-17 33 views
2

我是全新的data.table程序包,似乎陷入了一個非常基本的,有些奇怪的問題。我無法發佈我正在使用的確切數據集,對此我表示歉意 - 但我認爲這個問題很簡單,足以說清楚,希望這個問題仍然非常清楚。如何通過變量傳遞參數到data.table [J()]

比方說,我有一個data.table像這樣,與主要X:

set1 
    x y 
1: 1 a 
2: 1 b 
3: 1 c 
4: 2 a 

我想返回的set1包含所有行x == 1一個子集。這在data.table中非常簡單:set1[J(1)]。巴姆。完成。我也可以分配z <- 1,並致電set1[J(z)]。再說一遍:效果很好。

...除了當我試圖擴大到我的實際數據集,其中包含約6M行。當我打電話給set1[J(1674)]時,我得到了一個78行的回報,這正是我要找的。但我需要能夠查找(字面上)4M這些子集。當我將要搜索的值分配給變量id <- 1674並致電set1[J(id)] ... R幾乎取消了我的桌面。

很明顯東西我不明白是在data.table下進行的,但我一直無法弄清楚什麼。通過堆棧溢出谷歌和ogging,表明這應該工作。出於純粹的妄想,我試過了:

id <- quote(1674) 
set1[J(eval(id))] 

......但那遠遠差得多。什麼......發生了什麼事?

+0

你能提供一些關於R打印出來的更多細節嗎? –

+0

是的,沒有。是的,我可以提供更多的細節 - 但R不打印任何*。根據'top',當我調用'set1 [J(id)]'時,rsession開始使用高達97%的系統內存。直到我設法在一段時間後終止rsession進程之後,這個盒子才變得功能無法使用。這與'set1 [J(1674)]'相反,只要我按下'enter',它就返回78行。 – Gastove

+2

是你的data.table set1中的一列ID – mnel

回答

3

[@mnel打我把它當作我寫...]

幾乎可以肯定的set1一列恰巧被稱爲"id";即,

isTRUE("id" %in% names(set1)) 

造成set1[J(id)]自加入set1$idset1,在呼叫範圍忽略id

如果是這樣,有幾種方法,以避免作用域像這樣的問題:

.id = <your 4M ids> 
set1[J(.id)] 

,或者使用的事實,一個名字i在呼叫範圍進行評估:

JDT=J(id); set1[JDT] 

eval也是eval'd在呼叫範圍內:

set1[eval(J(id))] 

或者,我們也想使這個更清晰,更健壯,更容易,所以一個想到的就是添加..

set1[..(J(id))]  # .. alias for eval 

或者是:

set1[J(..id)] 

其中..從文件系統的借用其意..,意思是單層。如果..爲前綴的符號,然後你可以這樣做:

DT[colB==..id] 

其中==目前使用的是爲了說明。在該示例中,colB預計爲列名稱,..id將在調用範圍(上一級)中找到id。我們的想法是,程序員想要的代碼讀者會很清楚這一點。

+0

Ha!是的,就是這樣。非常感謝!回想起來,這似乎顯而易見。 – Gastove