2

I occasionally get this error when I'm using data table. I had a hard time coming up with an example to replicate the error, so I apologize that this one is not very realistic.

(numbers vary for N and J)

The error seems to happen most often when I use the unique function in the j column.

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)]

Another similar example is as follows:

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)]

The first example gives numbers that seem to relate to the actual data, but the second example comes up with a strange number.

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)

Can someone tell me what causes this?

4

1 回答 1

3

这是因为通过添加新行,您正在创建一个列表,其中unique(group1)将包含 for group2 = w、值a,b,cgroup1 = a,b,c,aand .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)。

于 2013-07-29T20:27:12.717 回答