【问题标题】:Using := in data.table with subset for i and a vector for update在 data.table 中使用 := 和 i 的子集和更新的向量
【发布时间】:2014-06-04 11:02:46
【问题描述】:

我正在尝试更新 data.table 的特定条目。我的 i 子集是另一个 data.table。当我尝试向 := 命令传递一个与子集长度相同的向量时,我收到一条警告。我可以用循环解决这个问题,但我认为有更好的方法。这段代码复制了我的结果:

DT <- data.table(ID = 1:10,V = rnorm(10))
setkey(DT,ID)
DT.alt <- DT[ID < 5,] ##Create a data.table with a subset of the observations
setkey(DT.alt,ID)
DT[,V:=rnorm(10)] ## Works
DT[DT.alt,V:=rnorm(1)]  ## Works
DT[DT.alt,V:=rnorm(4)] ## Warning and the first element is used for all rows

请注意,这可行,但我真的需要循环吗?

for(i in 1:dim(DT.alt)[1]) DT[DT.alt[i,],V:=rnorm(1)]

我认为我做错了什么,感谢任何帮助。

【问题讨论】:

  • 我使用来自 r-forge 的 data.table 版本 1.9.3 没有错误。您使用的是哪个软件包版本?
  • 是的,我使用的是 1.9.2,应该说明这一点。

标签: r data.table


【解决方案1】:

data.table 版本join 形式为x[i, j=...] - 即同时使用j 的连接被设计为隐含(或)by-without-by 操作。换句话说,这将为i 中的每个值计算j。所以它不会像你想要的那样工作。

在得到很多用户的反馈后,为了保持一致性,current development version 1.9.3 中的这种设计选择已被更改(有时会被推送到 CRAN 版本 1.9.4)。您可以查看讨论herehere 和功能请求(FR)here

所以在1.9.3 中,这将按预期工作(正如@BenBarnes 指出的那样)。也就是说,默认情况下,x[i, j=...] 将首先执行一次join 和评估j,而不是为每个i 获取j。相反,如果您喜欢旧行为,则必须明确声明 by,如下所示:

## v 1.9.3
## performs the join and then calculates/evaluates j
x[i, j]
## explicitly state by to obtain j for each i
x[i, j, by=.EACHI]

当这个版本到达 CRAN 时,还应该有一个使用旧版本的规定(这样现有代码不会被破坏),并警告说这个功能将在下一个版本中被弃用(或类似的东西 -这将如何完成尚未最终确定)。

总而言之,您的代码将从 &gt;= 1.9.3 版本开始按预期工作。

请注意,.EACHI 功能尚未在 ?data.table 中记录。这仍然是一个开发版本。当它发布到 CRAN 时,您可以在 ?data.table 中找到 .EACHI 的文档,其中还记录了所有其他特殊变量,如 .I.N.GRP.BY 等。

HTH


编辑:如果您必须使用&lt;= 1.9.2 有效地做到这一点,那么您可以通过首先找到匹配的索引来做到这一点,如下所示:

idx = DT[DT.alt, which=TRUE]
DT[idx, V := rnorm(length(idx))]

【讨论】:

  • 谢谢!这就是我一直在寻找的
  • +1 以获得清晰和细节。只是想知道是否有一个地方可以让我了解“所有”这些功能,例如:.EACHI、.I 等。
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2019-12-03
  • 1970-01-01
相关资源
最近更新 更多