8

共通の列とkeyでルックアップテーブルとマージして、data.tableに新しい列を作成したいと思います。次に、この新しい列(、、 )の値から、data.tableの列にインデックスを付ける3つの新しい列(、、)を生成します。index1index2keyabcabcvalue

私のdata.tableは次のようになります。

    index1      index2    value
1       2          0     0.00
2       1          2    -5.00
3       3          2    -5.00
4       3          2    17.50
5       2          2    15.00
6       1          2    -7.50
7       3          2     3.75
8       1          2    -8.75
9       2          1    15.00
10      2          1    12.50

ルックアップテーブルは次のとおりです。

 index1  index2  key
1    1        1   a
2    1        2   b
3    2        1   a
4    2        2   c
5    3        1   c
6    3        2   b

最終結果は次のようになります。

    index1     index2   value  key       a       b      c
1       2          0     0.00   NA      NA      NA     NA
2       1          2    -5.00    b      NA   -5.00     NA
3       3          2    -5.00    b      NA   -5.00     NA
4       3          2    17.50    b      NA   17.50     NA
5       2          2    15.00    c      NA      NA  15.00
6       1          2    -7.50    b      NA   -7.50     NA
7       3          2     3.75    b      NA    3.75     NA
8       1          2    -8.75    b      NA   -8.75     NA 
9       2          1    15.00    a   15.00      NA     NA
10      2          1    12.50    a   12.50      NA     NA

最初にdata.tableとルックアップテーブルをでマージして解決しようとしましたmerge()。次に、J()3回別々に使用して、上記の結果を達成しました。私はdata.tableにかなり慣れていませんが、手順を数回繰り返すのではなく、これを解決するためのよりエレガントな方法を学びたいと思っています。これが私のコードです:

DT <- merge(DT, lookup, by=c('index1', 'index2'), all.x=TRUE)
DT <- data.table(DT)  #Don't know why but DT became a data.frame after merge()
DT[J("a"), a:=value]
DT[J("b"), b:=value]
DT[J("c"), c:=value]
4

1 に答える 1

8

index1とindex2で結合したいので、そのまま使用するmergeか、これらを各テーブルにキーとして割り当てると、単純[]に結合に使用できます。(のようにDT[lookup]

 setkey(lookup, index1, index2)
 setkey(DT, index1, index2)

次に、次のようにテーブルkeyからそれぞれの一意を繰り返すことができますlookup

 keyVals <- unique(lookup[, key])

 for (k in keyVals)
   DT[lookup[key==k], c(k) := value]



結果:

DT
#     index1 index2 value    a     b  c
#  1:      1      2 -5.00   NA -5.00 NA
#  2:      1      2 -7.50   NA -7.50 NA
#  3:      1      2 -8.75   NA -8.75 NA
#  4:      2      0  0.00   NA    NA NA
#  5:      2      1 15.00 15.0    NA NA
#  6:      2      1 12.50 12.5    NA NA
#  7:      2      2 15.00   NA    NA 15
#  8:      3      2 -5.00   NA -5.00 NA
#  9:      3      2 17.50   NA 17.50 NA
# 10:      3      2  3.75   NA  3.75 NA
于 2013-02-21T15:34:50.327 に答える