gpt4 book ai didi

r - 使用 := that performs calculations across factor levels by group 创建一个新列

转载 作者:行者123 更新时间:2023-12-04 04:43:36 25 4
gpt4 key购买 nike

是否可以在使用 :=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

我想创建一个新列 d,它是来自 A、a 和 A、b、B、a 和 B、b 等的值的差值。我想使用 :=,因为它可以在大型数据集上飞行多快。

我可以通过创建新的 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] 中的每个值重复。没关系。

最佳答案

根据您的意见以及您提供的当前解决方案,我建议如下:

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

关于r - 使用 := that performs calculations across factor levels by group 创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18538145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com