2014-09-04 22 views
1

我是data.table的新手,並認爲這是一個簡單的問題,但似乎無法在任何地方找到答案。在我的data.table子集中使用變量

我想根據兩列的值來對錶進行子集分類,這些列的名字我知道。但我想比較一下我不知道的價值。也就是說,我想爲DT []的i部分使用一個變量。但我似乎無法弄清楚如何去做。我看到的所有內容都解釋瞭如何爲j(即列名)使用變量,但不適用於i。

當我只是把變量的名稱,即

setkey(dtpredictions, colA, colB) 
nextweek = dtpredictions[J(uservar, weekvar)] 

返回整個表。試圖回答適用於FAQ 1.6,我想:

nextweek = dtpredictions[J(eval(quote(uservar)), eval(quote(weekvar)))] 

nextweek = dtpredictions[J(eval(user), eval(week))] 

但二者之間仍然返回整個表。

我很確定這很簡單,但我被卡住了。

編輯 我很抱歉沒有澄清:我想做一個二進制搜索,因爲我需要加速。我知道我可以使用==做矢量掃描,但是我不想。

+0

只是想確認'uservar'和'weekvar'是單個字符或數字向量。 – 2014-09-04 11:55:23

回答

2

發現了問題 - 我的變量中的一個具有相同的名稱,如表中的列。我實際上看到了一個關於類似問題here的問題,但是甚至沒有意識到我有這個問題。 (這是表中的另一列,而不是我正在子集的那一列。)

我改變了我用於子集的變量的名稱,現在它工作。

+0

bsg,你也許可以接受這個答案,所以這仍然是封閉的..?謝謝。 – Arun 2014-09-07 18:04:32

0

這是您要找的嗎?

setkey(dtpredictions, colA, colB) 
nextweek <- dtpredictions[colA == uservar & colB == weekvar] 
+0

這不是做矢量掃描,而是做data.table的主要好處之一的二進制搜索? – bsg 2014-09-04 11:16:22

+0

是的,它執行矢量掃描。在問題中未指定您正在查找哪種掃描類型。 – djhurio 2014-09-04 11:20:17

+0

對不起。我更新了這個問題。 – bsg 2014-09-04 11:23:32

1

嗯......有趣。這段代碼是否適合你?我沒有得到相同的錯誤。我正在使用data.table 1.9.3

require(data.table) 
iris <- data.table(iris) 

#Create new categorical variable 
set.seed(1) 
iris[ , new.var := sample(letters[1:5],150,replace=TRUE)] 

#Set keys 
setkey(iris,Species,new.var) 

#Create variables to reference 
check1 <- "setosa" 
check2 <- "b" 

#Return matches 
iris[J(check1,check2)] 

產生的表:

Sepal.Length Sepal.Width Petal.Length Petal.Width Species new.var 
1:   5.1   3.5   1.4   0.2 setosa  b 
2:   4.9   3.0   1.4   0.2 setosa  b 
3:   5.0   3.6   1.4   0.2 setosa  b 
4:   5.4   3.7   1.5   0.2 setosa  b 
5:   4.3   3.0   1.1   0.1 setosa  b 
6:   5.7   3.8   1.7   0.3 setosa  b 
7:   5.1   3.7   1.5   0.4 setosa  b 
8:   4.8   3.4   1.9   0.2 setosa  b 
9:   5.0   3.0   1.6   0.2 setosa  b 
10:   5.2   3.5   1.5   0.2 setosa  b 
11:   4.7   3.2   1.6   0.2 setosa  b 
+0

您的示例適用於我的系統。多虧了這一點,我弄清楚了問題所在 - 我在表格中有一個與我的變量名稱相同的列。我在這裏閱讀了關於這個問題的問題,甚至沒有注意到我有同樣的問題。如果我不接受你的回答,我希望你不要介意,因爲這不是問題,但非常感謝你! – bsg 2014-09-04 13:57:23