当行是 i 按列的子集时,v1.15.2 中的 data.table shift() 不起作用 - `DT[i == TRUE, (cols) := shift(), by = col]`

问题描述 投票:0回答:1

使用 data.table v1.14.2(R 4.2.1 - 编辑:也与 v1.14.8 和 R 4.2.3 一起使用),我能够使用 shift() 在行后按组分配

j
中的新列
i
中是子集。相同的代码现在无法使用 data.table v1.15.2 (R 4.3.3).

这是一些示例数据

set.seed(1)
data <- data.table(iris)[Species %in% c(
    'versicolor', 'virginica'
), .(Species, value = Petal.Width)][, .SD[1:8], by = Species]
data[, to.keep := runif(.N) > .3]
data # N:16, N[TRUE]:11

#        Species value to.keep
#  1: versicolor   1.4   FALSE
#  2: versicolor   1.5    TRUE
#  3: versicolor   1.5    TRUE
#  4: versicolor   1.3    TRUE
#  5: versicolor   1.5   FALSE
#  6: versicolor   1.3    TRUE
#  7: versicolor   1.6    TRUE
#  8: versicolor   1.0    TRUE
#  9:  virginica   2.5    TRUE
# 10:  virginica   1.9   FALSE
# 11:  virginica   2.1   FALSE
# 12:  virginica   1.8   FALSE
# 13:  virginica   2.2    TRUE
# 14:  virginica   2.1    TRUE
# 15:  virginica   1.7    TRUE
# 16:  virginica   1.8    TRUE

使用data.table v1.14.2(R 4.2.1),我可以仅考虑

i
中的某些值来按组创建滞后列:

mycols <- paste0('lag.', 1:3)
data[to.keep == TRUE, (mycols) := shift(value, n = 1:3, type = 'lag'), by = Species]
data
#        Species value to.keep lag.1 lag.2 lag.3
#  1: versicolor   1.4   FALSE    NA    NA    NA
#  2: versicolor   1.5    TRUE    NA    NA    NA
#  3: versicolor   1.5    TRUE   1.5    NA    NA
#  4: versicolor   1.3    TRUE   1.5   1.5    NA
#  5: versicolor   1.5   FALSE    NA    NA    NA
#  6: versicolor   1.3    TRUE   1.3   1.5   1.5
#  7: versicolor   1.6    TRUE   1.3   1.3   1.5
#  8: versicolor   1.0    TRUE   1.6   1.3   1.3
#  9:  virginica   2.5    TRUE    NA    NA    NA
# 10:  virginica   1.9   FALSE    NA    NA    NA
# 11:  virginica   2.1   FALSE    NA    NA    NA
# 12:  virginica   1.8   FALSE    NA    NA    NA
# 13:  virginica   2.2    TRUE   2.5    NA    NA
# 14:  virginica   2.1    TRUE   2.2   2.5    NA
# 15:  virginica   1.7    TRUE   2.1   2.2   2.5
# 16:  virginica   1.8    TRUE   1.7   2.1   2.2

但是,在 data.table v1.15.2 (R 4.3.3) 中尝试相同的代码会导致以下错误:

Error in `[.data.table`(data, to.keep == TRUE, `:=`((mycols), shift(value,  : 
  Supplied 16 items to be assigned to 11 items of column 'lag.1'. If you wish to 'recycle' the RHS please use rep() to make this intent clear to readers of your code.

当然还有其他方法可以实现我的目标。例如,我可以在

j
:

中进行冗余行子集设置
data[to.keep == TRUE, (mycols) := shift(value[to.keep == TRUE], n = 1:3, type = 'lag'), by = Species]

但是,我知道原始代码应该也可以工作。我错过了什么吗?

我已经检查了文档(

man/shift.Rd
)或函数定义(
R/shift.R
)中的更改,但没有发现任何相关更改(例如,我尝试使用
assign(..., fill='NA')
得到相同的结果)。我在 stackoverflow 也没有找到任何相关问题。

r data.table
1个回答
0
投票

不幸的是,您受到版本 1.15.0 和 1.15.2 中回归的影响:https://github.com/Rdatatable/data.table/issues/5962.

该问题现已在当前的

master
中得到解决,并应在未来一两周内在 CRAN 上发布为 1.15.4 版本。

您没有发现 shift.R 中有任何更改,因为相关更改位于

gshift()
(为 1.15.0 添加的组优化滞后计算)中。这仅用于
[
查询。

© www.soinside.com 2019 - 2024. All rights reserved.