【发布时间】:2016-06-27 23:03:35
【问题描述】:
我在 R 中有一个 ~10 毫米行的 data.table,我正在编写代码来更新变量的一些值。不幸的是,它必须通过循环语句来完成,所以当我使用赋值运算符:= 和i 的多个条件时,代码变得非常慢(每个循环约2.3 分钟)。我想知道是否有更有效的方法来组合多个条件和赋值运算符。例如:
require(data.table)
set.seed(123)
x <- data.table(V1 = LETTERS[1:3], V2 = rnorm(10), V3 = NA)
y <- data.table(V1 = LETTERS[1],V3 = TRUE)
x
V1 V2 V3
1: A -0.56047565 NA
2: B -0.23017749 NA
3: C 1.55870831 NA
4: A 0.07050839 NA
5: B 0.12928774 NA
6: C 1.71506499 NA
7: A 0.46091621 NA
8: B -1.26506123 NA
9: C -0.68685285 NA
10: A -0.44566197 NA
y
V1 V3
1: A TRUE
我需要做的是在特定条件下将y$V3 分配给x$V3。结果可以通过使用来实现:
x[V1==y$V1 & V2 >= 0,V3:=y$V3]
x
V1 V2 V3
1: A -0.56047565 NA
2: B -0.23017749 NA
3: C 1.55870831 NA
4: A 0.07050839 TRUE
5: B 0.12928774 NA
6: C 1.71506499 NA
7: A 0.46091621 TRUE
8: B -1.26506123 NA
9: C -0.68685285 NA
10: A -0.44566197 NA
但是,这在我的代码中非常耗时。
谢谢,
【问题讨论】:
-
您最好在两个集合上都将密钥设置为
V1,然后再加入x[y]。 -
我认为如果不了解更多信息,这将很难解决。我刚刚在 10M 行上运行了你的操作,它在 1 秒内完成......我觉得这里肯定还有更多工作要做
-
@thelatemail 感谢您的回复。在这种情况下,有没有办法在连接语句中包含第二个条件
V2 >= 0?在我的实际代码中,我没有主键。相反,它是“弥补”缺少 PK 的约 10 个条件语句的组合。
标签: r data.table