数据表错误“maxn(N)不是此j列长度(J)的精确倍数”

时间:2013-07-29 20:17:25

标签: 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)

有人可以告诉我是什么原因导致的吗?

1 个答案:

答案 0 :(得分:3)

这是因为通过添加新行,您可以创建一个包含unique(group1)的列表,group2 = w包含值a,b,c以及group1 = a,b,c,a.N = 4

现在,当元素数量不匹配时,data.table会尝试回收值。也就是说,由于第3个值是4,并且该组的最大元素是4,它将尝试循环4次,4次。这就是为什么你在绑定最后一行之前得到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)。