是否可以使用带有:=
的{{1}}来创建新列的条件中的键值?
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
我想创建一个新列> 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,b , B的值不同, a 和 B,b 等。我想使用d
,因为它在大型数据集上的飞行速度有多快。
我可以通过创建新的:=
,合并以及其他内容来获取我正在寻找的d
列。但这只是感觉很难看。
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
中的每个值重复。没关系。
答案 0 :(得分: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