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