我在使用数据表时偶尔会遇到此错误。我很难想出一个例子来复制这个错误,所以我很抱歉这个例子不太现实。
(N 和 J 的数字不同)
当我在 j 列中使用 unique
函数时,该错误似乎最常发生。
DT = data.table(
group1 = rep(c('a', 'b', 'c', 'd'), each = 3),
group2 = rep(c('w', 'x', 'y', 'z'), times = 3),
values = rep(1:6, times = 2))
## Works:
DT[i=TRUE, j=list(unique(group1), group1, .N), keyby=list(group2)]
## Error:
DT = rbind(DT, DT[1])
DT[i=TRUE, j=list(unique(group1), group1, .N), keyby=list(group2)]
另一个类似的例子如下:
set.seed(3)
DT = data.table(
group1 = sample(c('a', 'b', 'c', 'd'), 1000, replace=TRUE),
group2 = sample(c('w', 'x', 'y', 'z'), 1000, replace=TRUE),
values = sample(1:20, replace = TRUE))
DT[, j=list(unique(group1), group1), keyby=list(group2)]
第一个示例给出的数字似乎与实际数据相关,但第二个示例给出了一个奇怪的数字。
Error in `[.data.table`(DT, , j = list(unique(group1), group1), keyby = list(group2)) : maxn (242) is not exact multiple of this j column's length (4)
谁能告诉我这是什么原因造成的?
最佳答案
这是因为通过添加新行,您将创建一个包含 unique(group1)
的列表,对于 group2 = w
,该列表将具有值 a,b,c
和 group1 = a,b,c,a
和 .N = 4
。
现在,当元素数量不匹配时,data.table
会尝试回收这些值。也就是说,由于第三个值是 4,并且该组的最大元素是 4,因此它将尝试回收 4、4 次。这就是为什么在绑定(bind)最后一行之前你得到了 N = 3, 3 次。
但是,除非要回收的元素是较大对象长度的倍数,否则它将无法回收。也就是说,在 .N
的情况下,它的长度为 1,1 乘以 4 得出较大值的长度。但是,3 不能乘以整数得到 4。因此,不可能回收这些值...
作为测试,请执行以下操作:
DT = data.table(
group1 = rep(c('a', 'b', 'c', 'd'), each = 3),
group2 = rep(c('w', 'x', 'y', 'z'), times = 3),
values = rep(1:6, times = 2))
DT <- rbind(DT, DT[c(1,5,9)])
在这里,您已确保 group1
大小为 6,您可以从 3 (unique(group1)
) 获得该大小。所以,这会工作得很好。
重要的信息是,当存在不均匀的组时,值将被回收。为了成功回收,较小对象的长度应为较大对象的整数倍。
希望这能澄清问题。
编辑:对于第二个数据,242
不是随机数...如果您这样做:
DT[, .N, by=group2]
group2 N
1: w 242
2: x 249
3: y 273
4: z 236
对应于group2=w
,您有 242 个元素。 group1
有 4 个独特的元素。并且 4 无法完全回收以达到 242 的长度(4 不能完全整除 242)。
关于r - 数据表错误 "maxn (N) is not exact multiple of this j column' s长度(J)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17933398/