在data.table子集的i中使用变量

时间:2014-09-04 11:05:41

标签: r data.table subset

我是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))]

但两人仍然返回整个表格。

我很确定这很简单,但我被卡住了。

修改 我为之前没有澄清道歉:我想做二分搜索,因为我需要加速。我知道我可以使用==进行矢量扫描,但我不愿意。

3 个答案:

答案 0 :(得分:2)

发现问题 - 我的一个变量与表中的列具有相同的名称。我实际上看到了一个关于类似问题here的问题,但是我甚至没有意识到我遇到了这个问题。 (这是表中的另一列,而不是我在子集上的那一列。)

我将我正在使用的变量的名称更改为子集,现在它可以正常工作。

答案 1 :(得分: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

答案 2 :(得分:0)

这是你要找的吗?

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