本文介绍了有人能解释一下当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中是如何工作的吗的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!