【问题标题】:R: Efficient way of assigning values to data.table with multiple conditionsR:为具有多个条件的 data.table 赋值的有效方法
【发布时间】: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 &gt;= 0?在我的实际代码中,我没有主键。相反,它是“弥补”缺少 PK 的约 10 个条件语句的组合。

标签: r data.table


【解决方案1】:

在最新的开发版本 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")

【讨论】:

  • 感谢您的建议。它似乎符合我的需要,但我在语法上遇到了一些问题。我检查了data.table 包的文档,但我不明白on= 参数如何区分条件语句中xy 中的对象。例如,函数如何识别V2V2&gt;=V2 语句中的哪个?另外,是否有可能某些条件只引用一个data.table(例如V2 &gt;= 0.5而不是V2 &gt;= V2)?
  • @PietroFranzero 好问题,如果您查看data.table#1452,您会看到?data.table(文档)尚未完成任务。在on 中,LHS 指的是x,而RHS 指的是i,因为它是您键入它们时的顺序。单列名扩展为==,所以这里:on=.(V1==V1, V2&gt;=V2)
  • @PietroFranzero 关于在on 中使用表达式(不仅仅是引用列名)的第二个问题仍在待办事项列表中,详情请参阅data.table#1639
猜你喜欢
  • 2014-09-30
  • 1970-01-01
  • 2019-10-09
  • 2012-12-22
  • 2021-04-20
  • 2020-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多