【问题标题】:data.table gives the error: "logical error. i is not a data.table, but 'on' argument is provided"data.table 给出错误:“逻辑错误。我不是 data.table,但提供了 'on' 参数”
【发布时间】:2018-04-03 12:27:54
【问题描述】:

给出如下代码。

library(data.table)

dt <- data.table(V1=round(runif(9,100,999),2), V2=rep(1:3,3),
                 V3=round(runif(9,10,99),2), V4=rep(letters[1:3],3))
setindex(dt,V4)

F1 <- dt[V2==2 & V3>=3, max(V1)]            
F2 <- dt[V2==2 & V3>=3, max(V1), on = "V4"]      

我 100% 确定 class(dt) 是“data.table, data.frame” 它在 F1 上运行良好,但出现了错误

逻辑错误。 i 不是 data.table,但提供了 'on' 参数。

什么时候F2?

为什么?如何解决?

我要做的不是子集(或分组),而是使用“on”命令提高计算效率,我被告知是二级索引的关键字。 非常感谢。


我知道我在哪里犯了错误。简单地说,我以错误的方式使用它。 当给出“on”命令时,i 始终是一个 data.table。

我最初的目的是高效搜索目标。

条件:V3>=3,V2==2 目标:最大(V1)

我不能通过 i 一个条件,但我可以使 i 成为一个 data.table,如下所示。

F2 <- dt[V3>=3][V2==2,max(V1), on = "V4"]

完美运行! 谢谢大家。

【问题讨论】:

  • on 用于加入data.tables 时。你想达到什么目的?你的意思是by
  • i[.data.table 的第一个(技术上是第二个)参数。您将V2==2 &amp; V3&gt;=3 传递给i,这是一个逻辑向量而不是data.table。
  • @clemens 谢谢。我的样本具有误导性。让我解决它。
  • @Roland 我想我明白了你所说的。 “on”命令是为了提高对以i为首的新data.table进行分组时的效率,我使用i作为搜索条件。当然它出错了,只是因为我没有按应有的方式使用它。现在我的问题是如何提高效率?如果我有 4000 万行。

标签: r data.table


【解决方案1】:

您没有使用正确的子集语法。您必须在工作区中有一些名为 V2V3 的对象。 data.table 认为您正在合并它们。 i 参数是[.data.table 的第一个参数。将V2==2 &amp; V3&gt;=3 替换为(V2==2 &amp; V3&gt;=3) 以引用列变量。请参阅here,了解在[.data.table 中使用i= 作为子集的范围界定的微妙之处。最后一个on 应该是by(尽管由于子集语法您仍然会遇到错误)。

【讨论】:

  • 使用V2==2 &amp; V3&gt;=3(V2==2 &amp; V3&gt;=3)都没有关系。关于子集,它们都会给出相同的结果。
  • @Jaap 你是对的。然而,非常有趣的是,可以向on= 提供一个参数并让i= 丢失,并且它会在没有任何警告或错误的情况下执行。 [.data.table 仅在两者都为真时引发错误。可以在[.data.table 的一个实例中将一个data.table 子集合并到另一个data.table 吗?
  • i 存在时,函数的内部控制流只寻找on=,我猜;并检查i 是否与on= 一致...不确定您的最后一个问题是什么意思,但如果有兴趣,您可以发布一个新问题来说明它。
猜你喜欢
  • 2021-04-26
  • 2012-02-29
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多