r语言 - 错误:在 data.table 中创建多个变量时,较长的对象长度不是较短对象长度的倍数



我正在尝试在一个命令中创建data.table的多个列,因为逻辑很简单。我a0有起始值列,需要通过简单地将常量添加到下一列来创建时间演变。

这是可重现的示例

dt <- data.table(a0 = c(0.3, 0.34, 0.45, 0.6, 0.37, 0.444))
dt[, paste0('a', 1:5) := a0 + 1:5 / 4]

我希望这会产生 a1、a2、a3、a4、a5 列,只需将 1/4 添加到下一列,而不是得到警告和不正确的结果

longer object length is not a multiple of shorter object length
dt
a0    a1    a2    a3    a4    a5
1: 0.300 0.550 0.550 0.550 0.550 0.550
2: 0.340 0.840 0.840 0.840 0.840 0.840
3: 0.450 1.200 1.200 1.200 1.200 1.200
4: 0.600 1.600 1.600 1.600 1.600 1.600
5: 0.370 1.620 1.620 1.620 1.620 1.620
6: 0.444 0.694 0.694 0.694 0.694 0.694

看起来 R 的计算维度错误。试图添加列表dt[, paste0('a', 1:5) := list(a0 + 1:5 / 4)],但没有运气。

您会收到警告,因为length(dt$a0)是 6,而length(1:5)是 5。

dt$a0 + 1:5
#[1] 1.300 2.340 3.450 4.600 5.370 1.444

警告消息: 以 dt$a0 + 1:5 为单位: 较长的对象长度不是较短对象长度的倍数

在这里,1:5的第一个值被回收并添加到dt$a0[6].

您不能像这样直接引用上一列。如果您想在这种情况下根据以前的列值添加新列,您可以执行以下操作:

library(data.table)
n <- 5
dt[, paste0('a', seq_len(n)) := lapply(seq_len(n)/4, function(x) x + a0)]
dt
#      a0    a1    a2    a3    a4    a5
#1: 0.300 0.550 0.800 1.050 1.300 1.550
#2: 0.340 0.590 0.840 1.090 1.340 1.590
#3: 0.450 0.700 0.950 1.200 1.450 1.700
#4: 0.600 0.850 1.100 1.350 1.600 1.850
#5: 0.370 0.620 0.870 1.120 1.370 1.620
#6: 0.444 0.694 0.944 1.194 1.444 1.694

最新更新