我是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 :(得分: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]