gpt4 book ai didi

r - 匹配变量后,仅将一个变量从一个 R data.table 复制到另一个

转载 作者:行者123 更新时间:2023-12-04 12:30:36 26 4
gpt4 key购买 nike

我可以通过类似的方式将数据框中一列的匹配副本复制到另一列

DF2$y <- DF1[match(DF2$id2, DF1$id1), "z"]  # DF1 and DF2 are data frames

其中 DF2$id2DF1$id1 匹配。我想知道对于这种操作,我可以用数据表做什么。我的数据表有数百万行和数百列。我已经完成了 setkey(DT1, id1)setkey(DT2, id2)

这个有效:

DT2[, y := DT1[match(DT2$id2, DT1$id1), "z"]]  # DT1 and DT2 are data tables

但我担心 match 部分可能需要比必要的时间更长的时间。 (或者这是不可避免的?)

我知道我还可以使用列选择、合并和重命名:

tmp <- DT1[, c("id1", "z")]  # column selection
DT3 <- merge(DT2, tmp, by.x = "id2", by.y = "id1", all.x = TRUE, suffixes = c("", ".y")) # merge
setnames(DT3, "z.y", "y") # rename

(其中前两行可以写在一行上)但这似乎有点太复杂了。是否有更简单快速的解决方案?

谢谢。

例子:

library(data.table)
DF1 <- data.frame(id1=2:4, x=LETTERS[1:3], z=11:13)
DF2 <- data.frame(id2=1:4, x=LETTERS[5:8], z=21:24)
DF1
# id1 x z
# 1 2 A 11
# 2 3 B 12
# 3 4 C 13
DF2
# id2 x z
# 1 1 E 21
# 2 2 F 22
# 3 3 G 23
# 4 4 H 24

DT1 <- data.table(DF1)
DT2 <- data.table(DF2)
setkey(DT1, id1)
setkey(DT2, id2)

DF2$y <- DF1[match(DF2$id2, DF1$id1), "z"]
DF2 # correct
# id2 x z y
# 1 1 E 21 NA
# 2 2 F 22 11
# 3 3 G 23 12
# 4 4 H 24 13

DT2[, y := DT1[match(DT2$id2, DT1$id1), "z"]]
DT2
# id2 x z y
# 1: 1 E 21 NA
# 2: 2 F 22 11
# 3: 3 G 23 12
# 4: 4 H 24 13
DT2[, y := NULL]

tmp <- DT1[, c("id1", "z")]
DT3 <- merge(DT2, tmp, by.x = "id2", by.y = "id1", all.x = TRUE, suffixes = c("", ".y"))
setnames(DT3, "z.y", "y")
DT3
# id2 x z y
# 1: 1 E 21 NA
# 2: 2 F 22 11
# 3: 3 G 23 12
# 4: 4 H 24 13

## Simpler alternatives?

最佳答案

如果我理解正确,OP 想要将列 zDT1 附加到 DT2 作为列 y id 列匹配的位置。

,这可以使用更新连接来解决:

library(data.table)
DT2[DT1, on = .(id2 = id1), y := i.z]
DT2
   id2 x  z  y
1: 1 E 21 NA
2: 2 F 22 11
3: 3 G 23 12
4: 4 H 24 13

请注意,DT2通过引用 更新的,即没有复制整个数据对象。这对于 OP 的数百万行的大型生产数据集可能很方便。

警告

这是有效的,因为 id1id2唯一的,示例用例就是这种情况。因此,请确保在对重复值进行更新联接时得到您想要的结果。

让我们看看如果 id1 列中有重复值会发生什么,例如

如果 DT1id1 == 4 重复

(DT1 <- data.table(id1 = c(2:4, 4), x = LETTERS[1:4], z = 11:14))
   id1 x  z
1: 2 A 11
2: 3 B 12
3: 4 C 13
4: 4 D 14

然后

DT2[DT1, on = .(id2 = id1), y := i.z][]

返回

   id2 x  z  y
1: 1 E 21 NA
2: 2 F 22 11
3: 3 G 23 12
4: 4 H 24 14

所以,更新连接

  • 没有在 DT2 中创建额外的行(这可能是您可能希望避免复制大型数据集的原因),
  • 在多个匹配项的情况下选择了最后一次出现的 z

关于r - 匹配变量后,仅将一个变量从一个 R data.table 复制到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69366291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com