【问题标题】:Use variable in i of data.table subset在 data.table 子集中的 i 中使用变量
【发布时间】:2023-03-13 17:25:01
【问题描述】:

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

但两者仍然返回整个表。

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

编辑 我很抱歉没有早点澄清:我想做一个二进制搜索,因为我需要加速。我知道我可以使用 == 进行矢量扫描,但我不想这样做。

【问题讨论】:

  • 只是想确认uservarweekvar 是单个字符或数字向量。

标签: r data.table subset


【解决方案1】:

发现问题 - 我的一个变量与表中的一列同名。我实际上看到了一个关于类似问题here 的问题,但我什至没有意识到我有这个问题。 (这是表格中的另一列,而不是我要细分的那一列。)

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

【讨论】:

  • bsg,您也许可以接受这个答案,以便保持关闭状态..?谢谢。
【解决方案2】:

嗯……很有趣。这段代码似乎对您有用吗?我没有得到同样的错误。我正在使用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 上阅读了关于这个问题的问题,甚至没有注意到我有同样的问题。我希望你不介意我不接受你的回答,因为这不是问题,但非常感谢!
【解决方案3】:

这是您要找的吗?

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

【讨论】:

  • 这不是进行矢量扫描,而不是作为 data.table 的主要优点之一的二进制搜索吗?
  • 是的,它进行矢量扫描。问题中未指定您要查找的扫描类型。
  • 你知道怎么用二分查找吗?
猜你喜欢
  • 2016-12-16
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 2015-10-14
  • 2019-11-27
  • 1970-01-01
  • 2021-03-23
相关资源
最近更新 更多