r - 数据表错误 "maxn (N) is not exact multiple of this j column' s长度(J)"

标签 r data.table

我在使用数据表时偶尔会遇到此错误。我很难想出一个例子来复制这个错误,所以我很抱歉这个例子不太现实。

(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,cgroup1 = 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/

相关文章:

r - 如何防止 Plotly 中的散点淡出?

r - 有条件地将因子变量 1 的水平替换为特定变量 2

r - data.table 中按组划分的频率表 (R)

r - 清理因子级别(折叠多个级别/标签)

r - 在两列相等的数据框中查找行

r - 调试 package::function() 尽管使用了惰性求值

r - 如何选择一个表中与另一个表中的行相匹配的所有行

r - 如何在data.table的每一行中应用函数

r - 何时以及为什么 "print"需要两次尝试打印 "data.table"?

r - 聚合数据并排除一列中的重复项