创建一个新列,其中:=按组执行因子级别的计算

时间:2013-08-30 17:08:08

标签: r data.table

是否可以使用带有:=的{​​{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中的每个值重复。没关系。

1 个答案:

答案 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