r - 有人可以解释在 data.table 中执行更新时,mult 是如何工作的吗(使用 .EACHI 和 mult)

标签 r join data.table left-join

我再次努力理解 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, ...] 获得的性能要差得多。

最佳答案

I'd like to use the first value in the right table to override the value of the left table


选择第一个值并单独更新它们:
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 的匹配行被选中。这解释了 OP 中显示的结果。
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

关于r - 有人可以解释在 data.table 中执行更新时,mult 是如何工作的吗(使用 .EACHI 和 mult),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68209975/

相关文章:

在 Julia 中重现 R 中的 `expand.grid` 函数

mysql - LEFT JOIN 或 INNER JOIN 从一个表中查找第二个表中的项目

r - 使用 data.table 将 R 中的许多列乘以特定的其他列?

r - 如何将具有相同协变量的个体的二项式响应数据分解为伯努利,反之亦然?

使用 R & data.table 或 HIVE 将\\N 替换为 NA

r - 获取 axis.text 和 axis.title 之间的边距值

r - 显示哪些变量以及有多少个变量对应于条件

r - 如何在ggbiplot中添加椭圆中心?

java - 如何改进两个 Json 结果之间的联接?

PHP MySQL 小查询超时,必须将限制设置为 10