我在R中有一个~10 mm的数据行。表和我编写代码来更新变量的某些值。不幸的是,它必须使用循环语句来完成,因此当我使用具有:=
的多个条件的赋值运算符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
但是,这在我的代码中过于耗时。
谢谢,
答案 0 :(得分:4)
在最新的开发版本1.9.7中,您可以找到非equi连接。然后,您只需将V2 := 0
添加到y
数据集,然后继续进行非等联接。
y[, V2 := 0]
x[y, V3 := i.V3, on=.(V1, V2>=V2)][]
# 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
请注意,double
(数字)字段上的加入可能受浮点影响,请阅读?setNumericRounding
了解详细信息。
要安装最新的开发版本,请使用以下命令:
install.packages("data.table", repos="https://Rdatatable.github.io/data.table")