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

3
我是新手,对于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)))] 

and

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

但是两者仍然返回整个表格。
我相信这很简单,但我卡住了。
编辑 我很抱歉之前没有澄清:我想进行二分搜索,因为我需要加速。我知道可以使用==进行向量扫描,但我不想这样做。

只想确认 uservarweekvar 是否为单字符或数字向量。 - Mike.Gahan
3个回答

3
发现了问题 - 我的一个变量与表中的一列具有相同的名称。实际上,我看到了一个关于类似问题的问题在这里,但我甚至没有意识到我有这个问题。(它是表中的另一列,而不是我正在子集化的那一列。)
我更改了我用来进行子集化的变量名称,现在它可以工作了。

bsg,你可以接受这个答案,这样它就会保持关闭状态了。谢谢。 - Arun

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

你提供的例子在我的系统上运行良好。由于这个例子,我找出了问题所在——我在表格中有一列与我的某个变量同名。我在 SO 上阅读了关于此问题的提问,却没有注意到自己也有相同的问题。非常感谢你的帮助,但是我希望你不要介意我不接受你的答案,因为它并不是问题的原因! - bsg

0

这是你在寻找的吗?

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

这不是进行向量扫描,而是二分搜索,这是data.table的主要优势之一吗? - bsg
是的,它执行向量扫描。问题中没有指定您要查找哪种类型的扫描。 - djhurio
你知道如何通过二分查找来实现吗? - bsg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接