r - 使用 := in data. 表,其中包含 i 的子集和更新向量

标签 r data.table

我正在尝试更新 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)]

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

最佳答案

data.table版本 <= 1.9.2,a join形式 x[i, j=...] - 即,连接 j也被设计为隐式(或)by-without-by手术。换句话说,这将计算 j对于 i 中的每个值。所以它不会按你的预期工作。

此设计选择已在 current development version 1.9.3 中更改。 (在收到大量用户反馈后,为了保持一致性,将在某个时候推送到 CRAN 版本 1.9.4)。您可以查看讨论here , here和功能请求 (FR) here .

所以在 1.9.3 ,这将按预期工作(正如@BenBarnes 指出的那样)。即默认情况下 x[i, j=...]首先会执行join并评估j之后,一次,而不是获取 j对于每个 i 。如果您想要旧的行为,则必须明确声明 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 时,还应该有一个使用旧版本的规定(这样现有代码就不会破坏),并警告该功能将在下一个版本中被弃用(或类似的内容 -具体如何完成尚未最终确定)。

总而言之,您的代码将从版本 >= 1.9.3 开始按预期工作.

Note that .EACHI feature is not yet documented in ?data.table. This is still a development version. When it's being released to CRAN, you can find the documentation for .EACHI in ?data.table, where all the other special variables like .I, .N, .GRP, .BY etc.. are also documented.

HTH


编辑:如果您必须使用 <= 1.9.2 有效地完成此操作,那么您可以首先找到匹配的索引,如下所示:

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

关于r - 使用 := in data. 表,其中包含 i 的子集和更新向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24035695/

相关文章:

r - 跨区间边界对数据进行分箱

r - 将函数标记为 data.table-unaware

r - 这种情节是什么以及如何改变它的颜色

在不规则间隔内 reshape 和汇总数据

r - .R 脚本文件在 PC 上的什么位置?

data.table 中的 rbind + setkey 比自动索引的 xts::rbind 慢?

r - 删除函数内data.table的列

r - 导入 csv 文件时列数错误

r - 在另一个函数中定义函数的优雅方式

r - 使用另一个数据表以主数据表 r 中的列为条件