gpt4 book ai didi

r - 合并两个 data.tables 但不更新特定列

转载 作者:行者123 更新时间:2023-12-02 16:02:16 25 4
gpt4 key购买 nike

我有一个 data.table 问题,我不确定这是否需要两个单独的操作。我有两个 data.tables 我想按特定列合并。但是,如果键之间存在匹配,我只想更新结果中的某些列。如果没有匹配项,那么我想将新数据附加到结果中。列名始终相同,因此无需填写。

示例:

在此示例中,我想按 n2 进行合并,但如果两者之间存在匹配的 n2 值,则仅更改结果中的 n3 datnew_dat,否则将 new_dat 中的数据附加到 dat

library(data.table)

## Example data
dat <- data.table(n1=letters[1:5], n2=letters[11:15], n3=letters[6:10])
# n1 n2 n3
# 1: a k f
# 2: b l g
# 3: c m h
# 4: d n i
# 5: e o j

## New data to be updated or appended depending on matching `n2`
new_dat <- data.table(n1=c('aa', 'z'), n2=c('k', 'xyz'), n3=c('bb', 'b'))
# n1 n2 n3
# 1: aa k bb
# 2: z xyz b

## Expected outcome:
## since 'k' is in 'dat' and 'new_dat', don't change 'n1' in merged result (but change 'n3')
res <- copy(dat) # there doesn't really need to be a copy (only for example)
res[n2 == 'k', `:=`(n3 = new_dat[n2 == 'k', n1])] # using `:=`() b/c multiple columns
res <- rbindlist(list(res, new_dat[!(n2 %in% dat$n2)]))
# n1 n2 n3
# 1: a k aa
# 2: b l g
# 3: c m h
# 4: d n i
# 5: e o j
# 6: z xyz b

这是否需要两个步骤:首先更新匹配变量,然后附加不匹配变量?或者,我可以以某种方式使用合并吗?

最佳答案

由于这本质上是带有一些额外条件的外部合并,因此您无法在 [ 运算符中一步完成此操作。我会执行以下操作:

rbind(copy(dat)[new_dat, n3 := i.n1, on = "n2"], new_dat[!dat, on = 'n2'])
# n1 n2 n3
#1: a k aa
#2: b l g
#3: c m h
#4: d n i
#5: e o j
#6: z xyz b

(如果您不关心原始数据的修改,可以删除副本)

关于r - 合并两个 data.tables 但不更新特定列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34345459/

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