2

データ テーブルを使用しているときに、このエラーが発生することがあります。エラーを再現する例を思いつくのに苦労したので、これはあまり現実的ではないことをお詫びします.

(NとJで番号が異なります)

uniquej列の関数を使用すると、エラーが最も頻繁に発生するようです。

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

最初の例では、実際のデータに関連しているように見える数値が示されていますが、2 番目の例では奇妙な数値が示されています。

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)

誰かがこれの原因を教えてもらえますか?

4

1 に答える 1

3

これは、新しい行を追加することでunique(group1)、 for 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ここで、サイズが 3 ( ) から取得できる 6 であることを確認しましたunique(group1)。だから、これはうまくいくでしょう。

持ち帰りのメッセージは、不均一なグループがある場合、値がリサイクルされるということです。また、リサイクルを成功させるには、小さいオブジェクトの長さが大きいオブジェクトの整数倍である必要があります。

これが物事を明確にすることを願っています。


編集: 2番目のデータの242場合、乱数ではありません...そうする場合:

DT[, .N, by=group2]
  group2   N
1:      w 242
2:      x 249
3:      y 273
4:      z 236

242 個の要素に対応しgroup2=wます。そしてgroup1、4つのユニークな要素があります。また、4 を完全に再利用して 242 の長さにすることはできません (4 は 242 を正確に分割しません)。

于 2013-07-29T20:27:12.717 に答える