本文介绍了有人能解释一下当MULT在连接(使用.EACHI和MULT)中执行UPDATE时,MULT在data.table中是如何工作的吗的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我再次努力理解在执行联接时更新时mult参数是如何工作的。我要做的是实现lj中定义的左连接。

出于性能原因,我想更新左表

重要的是,当左表和右表有共同的列时(不考虑连接列),我想使用右表中的第一个值来覆盖左表的值。我以为mult可以帮助我处理此多匹配问题,但我无法正确处理

library(data.table)
X <- data.table(x = c("a", "a", "b", "c", "d"), y = c(0, 1, 1, 2, 2), t = 0:4)
X
#        x     y     t
#   <char> <num> <int>
#1:      a     0     0
#2:      a     1     1
#3:      b     1     2
#4:      c     2     3
#5:      d     2     4

Y <- data.table(xx = c("f", "b", "c", "c", "e", "a"), y = c(2, NA, 3, 4, 5, 6), u = 2:7)
Y
#       xx     y     u
#   <char> <num> <int>
#1:      f     2     2
#2:      b    NA     3
#3:      c     3     4
#4:      c     4     5
#5:      e     5     6
#6:      a     6     7

# Expected result
#        x     y     t
#   <char> <num> <int>
#1:      a     6     0    <= single match on xx == "a" so Y[xx == "a", y] is used
#2:      a     6     1    <= single match on xx == "a" so Y[xx == "a", y] is used
#3:      b    NA     2    <= single match on xx == "b" so Y[xx == "b", y] is used
#4:      c     3     3    <= mult match on xx == "c" so Y[xx == "c", y[1L]] is used
#5:      d     2     4    <= no xx == "d" in Y so nothing changes


copy(X)[Y, y := i.y, by = .EACHI, on = c(x = "xx"), mult = "first"][]
#        x     y     t
#   <char> <num> <int>
#1:      a     6     0
#2:      a     1     1   <= a should always have the same value ie 6
#3:      b    NA     2
#4:      c     4     3   <= y == 4 is not the first value of y in the Y table
#5:      d     2     4

# Using mult = "all" is the closest I get from the right result
copy(X)[Y, y := i.y, by = .EACHI, on = c(x = "xx"), mult = "all"][]
#        x     y     t
#   <char> <num> <int>
#1:      a     6     0
#2:      a     6     1
#3:      b    NA     2
#4:      c     4     3    <= y == 4 is not the first value of y in the Y table
#5:      d     2     4

有人能给我解释一下上面有什么问题吗?

我想我可以使用Y[X, ...]达到我想要的效果,问题是X非常大,使用Y[X, ...]得到的性能要差得多。

推荐答案

选择第一个值并单独更新它们:

X[unique(Y, by="xx", fromLast=FALSE), on=.(x=xx), y := i.y]

   x  y t
1: a  6 0
2: a  6 1
3: b NA 2
4: c  3 3
5: d  2 4

fromLast=可以在删除重复项时选择第一行或最后一行。


如何处理多个匹配:

x[i, mult=]中,如果i的一行有多个匹配项,则mult确定选择了x的哪些匹配行。这解释了操作中显示的结果。

x[i, v := i.v]中,如果i的多行与x中的同一行匹配,所有相关i行将按顺序写入x行,因此最后一个i行将获得最终写入。打开详细输出以查看在更新中进行了多少编辑--它将超过本例中的x行数(因为行被重复编辑):

options(datatable.verbose=TRUE)
data.table(a=1,b=2)[.(a=1, b=3:4), on=.(a), b := i.b][]
# Assigning to 2 row subset of 1 rows
   a b
1: 1 4

这篇关于有人能解释一下当MULT在连接(使用.EACHI和MULT)中执行UPDATE时,MULT在data.table中是如何工作的吗的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-19 14:49