3

私は2つの大きなテーブルを持っています。1 つは識別子 (ソートされていない) で、もう 1 つは識別子のリスト (最初のテーブルにあるものすべてを含む) と 1 つの変数に関連付けられた値です。2 番目のテーブルにある関連付けられた値を含む列を最初のテーブルに追加したいと考えています。R の実装された関数を使用して進めるスマートな方法はありますか?

すなわち

table 1
id
8979786
62782
6268768
6776566

table 2
id        var
1          5
2          2
3          NA
…
9999999    6

そして結果は

table1
id       var
8979786   5
62782     NA
6268768   7
4776566   4

前もって感謝します

4

3 に答える 3

5

では、id列は両方のテーブルにありますか? merge一緒にできます: merge(table1, table2, sort = FALSE). SQL の内部結合、左結合、右結合、および外部結合と同様に、さまざまな種類の結合をエミュレートできる、マージを検討するための多くのオプションがあります。sorttable1 の元の順序を維持するために、ここに追加のパラメーターを追加しました。

テーブル 1 には ID があり、テーブル 2 には ID がなく、それらの NA を表示したい場合はall.x = TRUE、パラメーターとして追加します。これは、左結合と同等です。all.y右結合でありall = TRUE、完全外部結合と同等です。

再現可能な例:

> set.seed(1)
> table1 <- data.frame( id = sample(1:5, 5, FALSE))
> table1
  id
1  2
2  5
3  4
4  3
5  1
> table2 <- data.frame( id = 1:5, var = rnorm(5))
> table2
  id        var
1  1  1.2724293
2  2  0.4146414
3  3 -1.5399500
4  4 -0.9285670
5  5 -0.2947204
> merge(table1, table2, sort = FALSE)
  id        var
1  2  0.4146414
2  5 -0.2947204
3  4 -0.9285670
4  3 -1.5399500
5  1  1.2724293
于 2011-04-22T14:34:51.393 に答える
3

データが大きく、速度が問題になる場合に備えて、これを行う data.table の方法を次に示します。詳細については、次のヘルプ ページを参照してください?data.table

i が data.table の場合、x (外側の data.table) にはキーが必要です。i (つまり、内部の data.table) はキーを使用して x に結合され、一致する x の行が返されます。i の各列と x のキーの各列の間で等結合が実行されます。一致は、O(log n) 時間でコンパイルされた C のバイナリ検索です。i の列が x のキーよりも少ない場合、x の多くの行が i の各行に一致する可能性があります。i が x のキーよりも多くの列を持っている場合、結合に関与していない i の列が結果に含まれます。i にもキーがある場合、x のキー列との照合に使用されるのは i のキー列で
あり、2 つのテーブルのバイナリ マージが実行されます。

Chase から提供されたサンプル データを少し調整して、マッチングに関する特定のポイントをdata.tableより明確にしたことに注意してください。

require(data.table)
#Version 1.7.7
set.seed(1)
table1 <- data.table(id = sample(3:7, 5, FALSE), var1 = rnorm(5), key="id")
table2 <- data.table(id = 5:10, var2 = rnorm(6), key="id")

#Default: If id in table 1 is not in table 2, return NA
table2[table1]
#      id         var2       var1
# [1,]  3           NA -0.2947204
# [2,]  4           NA  1.2724293
# [3,]  5 -0.005767173 -0.9285670
# [4,]  6  2.404653389 -1.5399500
# [5,]  7  0.763593461  0.4146414

#If one wants to get rid of the NAs
table2[table1, nomatch=0]
#      id         var2       var1
# [1,]  5 -0.005767173 -0.9285670
# [2,]  6  2.404653389 -1.5399500
# [3,]  7  0.763593461  0.4146414

#Or the other way around: get all ids of table 2
table1[table2]
#      id       var1         var2
# [1,]  5 -0.9285670 -0.005767173
# [2,]  6 -1.5399500  2.404653389
# [3,]  7  0.4146414  0.763593461
# [4,]  8         NA -0.799009249
# [5,]  9         NA -1.147657009
# [6,] 10         NA -0.289461574

必須の速度テスト:

set.seed(10)
df1 <- data.frame(id = sample(1:5e6, 5e6, FALSE))
df2 <- data.frame(id = sample(1:5e6, 5e6, FALSE), var = rnorm(5e6))
system.time(df_solution <- merge(df1, df2, sort = TRUE))
#    user  system elapsed 
#   33.10    0.32   33.54
merge_dt <- function(df1, df2) {
  dt1 <- setkey(as.data.table(df1), "id")
  dt2 <- setkey(as.data.table(df2), "id")
  return(dt1[dt2])
}
system.time(dt_solution <- merge_dt(df1, df2))
#    user  system elapsed 
#   12.94    0.01   12.95 
all.equal(df_solution, as.data.frame(dt_solution))
#[1] TRUE

そして私のいつもの免責事項: 私はまだこのパッケージについても多くのことを学んでいるので、パッケージのホームページでより良い情報を見つけることができます。

于 2012-01-17T14:11:44.650 に答える
2

この問題を解決する関数を実装しました (2 つの data.frame オブジェクトの順序を維持しながら 2 つの data.frame オブジェクトをマージする)。コードとその使用例をここで確認できます。

http://www.r-statistics.com/2012/01/merging-two-data-frame-objects-while-preserving-the-rows-order/

于 2012-01-15T11:22:11.247 に答える