我在使用数据表时偶尔会出现此错误。我很难想出一个复制错误的例子,所以我很抱歉这个不太现实。
(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)
有人可以告诉我是什么原因导致的吗?
答案 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)。