:=
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,aとA,b、B,aとB, 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]
。それで大丈夫です。