R:为具有多个条件的data.table分配值的有效方法

时间:2016-06-27 23:03:36

标签: r data.table

我在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

但是,这在我的代码中过于耗时。

谢谢,

1 个答案:

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