1

次のように、all = TRUEを使用してmerge()を使用してデータフレームを結合するのと同じ方法で、2つのdata.tablesを結合しようとしています。

> x = data.frame(index = 1:10)
> y = data.frame(index = c(2,4,6), weight = c(0.2, 0.3, 0.5))
> x
   index
1      1
2      2
3      3
4      4
5      5
6      6
7      7
8      8
9      9
10    10
> y
  index weight
1     2    0.2
2     4    0.3
3     6    0.5
> merge(x,y, all=TRUE)
   index weight
1      1     NA
2      2    0.2
3      3     NA
4      4    0.3
5      5     NA
6      6    0.5
7      7     NA
8      8     NA
9      9     NA
10    10     NA

キャスト関数の結果であるmatched.weightsとcastedの2つのデータテーブルがあります。それらのキーは両方とも「インデックス」です。

> matched.weights
      index
 [1,]     1
 [2,]     2
 [3,]     3
 [4,]     4
 [5,]     5
 [6,]     6
 [7,]     7
 [8,]     8
 [9,]     9
[10,]    10
First 10 rows of 14708 printed. 
> casted
      index            1            2
 [1,] 10002 0.0049024578 3.057794e-03
 [2,] 10129 0.0011064567 8.481497e-04
 [3,] 10171 0.0012964050 5.540875e-03
 [4,] 10177 0.0008181397 6.981567e-04
 [5,] 10187 0.0060350971 2.156695e-03
 [6,]  1022 0.0011320117 8.665125e-04
 [7,] 10250 0.0047892924 7.725221e-03
 [8,] 10262 0.0044724898 8.787161e-06
 [9,] 10286 0.0016650838 7.162887e-05
[10,] 10299 0.0015840791 5.578903e-03
First 10 rows of 305 printed. 

それらをマージしようとすると、次のエラーが発生します。

> merge(matched.weights, casted, all=TRUE)
Error in setcolorder(dt, c(setdiff(names(dt), end), end)) : 
  neworder is length 5 but x has 3 columns.

また、data.table構文を使用すると、データエントリがNAに置き換えられます。

> merged = casted[matched.weights]
> merged
      index X1 X2
 [1,]     1 NA NA
 [2,]     2 NA NA
 [3,]     3 NA NA
 [4,]     4 NA NA
 [5,]     5 NA NA
 [6,]     6 NA NA
 [7,]     7 NA NA
 [8,]     8 NA NA
 [9,]     9 NA NA
[10,]    10 NA NA
First 10 rows of 14708 printed. 
> merged[10002]
     index X1 X2
[1,] 10002 NA NA
> sum(merged[[2]], na.rm=T)
[1] 0

誰かが私に何が起こっているのか説明できますか?

4

1 に答える 1

1

2 つのデータ テーブルが必要な場合merge(完全な外部結合の意味で、 に似ていall=TRUEます)、次を使用する必要がありますmerge.data.table

library(data.table)
dtx <- data.table(x, key="index")
dty <- data.table(y, key="index")
merge(dtx,dty, all=TRUE)
   index weight
1      1     NA
2      2    0.2
3      3     NA
4      4    0.3
5      5     NA
6      6    0.5
7      7     NA
8      8     NA
9      9     NA
10    10     NA

これは、データ フレームを使用した場合と同じ結果になります (ただし、はるかに高速です)。

の最近のバージョンでは一部のmerge機能が改善されていることに注意してください。そのdata.tableため、必ず最新の安定バージョンを入手してください。バージョン 1.8.0 を使用しています。

于 2012-07-12T14:14:24.850 に答える