2

:=withを使用して新しい列を作成する条件にキー値を使用することはできますdata.tableか?

set.seed(315)
DT = data.table(a = factor(LETTERS[rep(c(1:5), 2)]), 
                b = factor(letters[rep(c(1, 2), 5)]), 
                c = rnorm(10), key = c("a", "b"))

これにより、data.table次のようなa が得られます。

> DT
    a b           c
 1: A a  0.11610792
 2: A b -2.67495409
 3: B a -0.18467740
 4: B b  0.79994197
 5: C a  0.74565643
 6: C b  0.49959003
 7: D a  0.04385948
 8: D b -2.25996438
 9: E a -1.86204824
10: E b  0.11327201

A,aA,bB,aB, bdなどの値の差である新しい列を作成したいと考えています。大規模なデータセットでの飛行速度が速いため、を使用したいと思います。:=

d新しい s の作成、マージなどの毛むくじゃらで探している列を取得できますdata.tableが、これは見苦しく感じます。

dt.a <- DT[DT[, .I[b == "a"]]]
dt.b <- DT[DT[, .I[b == "b"]]]
dt <- merge(dt.a, dt.b, by = c("a"))

dt <- merge(dt.a, dt.b, by = c("a"))
> dt
   a b.x         c.x b.y       c.y
1: A   a  0.11610792   b -2.674954
2: B   a -0.18467740   b  0.799942
3: C   a  0.74565643   b  0.499590
4: D   a  0.04385948   b -2.259964
5: E   a -1.86204824   b  0.113272

> dt[, d:= c.x - c.y]
> dt
   a b.x         c.x b.y       c.y          d
1: A   a  0.11610792   b -2.674954  2.7910620
2: B   a -0.18467740   b  0.799942 -0.9846194
3: C   a  0.74565643   b  0.499590  0.2460664
4: D   a  0.04385948   b -2.259964  2.3038239
5: E   a -1.86204824   b  0.113272 -1.9753203

もっと直接的な方法はありますか?

これで仕事は完了です。データを分割しないと、 の各d値が元の の各値に対して繰り返されますDT[,a]。それで大丈夫です。

4

1 に答える 1

3

あなたの意見と現在の解決策として提供したものに基づいて、次のことをお勧めします。

DT[, d := diff(rev(c)), by = a]
DT
#     a b           c          d
#  1: A a  0.11610792  2.7910620
#  2: A b -2.67495409  2.7910620
#  3: B a -0.18467740 -0.9846194
#  4: B b  0.79994197 -0.9846194
#  5: C a  0.74565643  0.2460664
#  6: C b  0.49959003  0.2460664
#  7: D a  0.04385948  2.3038239
#  8: D b -2.25996438  2.3038239
#  9: E a -1.86204824 -1.9753203
# 10: E b  0.11327201 -1.9753203
于 2013-08-30T17:23:20.553 に答える