R 通过引用更新data.table,但在使用优先级向量存在重复项时,仅填充某些行

R 通过引用更新data.table,但在使用优先级向量存在重复项时,仅填充某些行,r,merge,data.table,conditional-statements,pass-by-reference,R,Merge,Data.table,Conditional Statements,Pass By Reference,我不太知道如何用词来形容这个标题,但下面是我要做的。我想使用dt2中的列来扩展数据表dt1。在dt1中,我正在更新/合并的列中存在重复数据。我的目标是仅在满足条件的情况下,以重复的方式在dt1中填充新列 由另一个变量指定。让我来说明我的意思: library(data.table) dt1 <- data.table(common_var = c(rep("a", 3), rep("b", 2)), condition_var = c("update

我不太知道如何用词来形容这个标题,但下面是我要做的。我想使用
dt2
中的列来扩展数据表
dt1
。在
dt1
中,我正在更新/合并的列中存在重复数据。我的目标是仅在满足条件的情况下,以重复的方式在
dt1
中填充新列 由另一个变量指定。让我来说明我的意思:

library(data.table)


dt1 <- data.table(common_var = c(rep("a", 3), rep("b", 2)),
                  condition_var = c("update1", rep(c("update2", "update3"), 2)),
                  other_var = 1:5)


dt2 <- data.table(common_var = c("a", "b", "C", "d"),
                  new_var1 = 11:14,
                  new_var2 = 21:24)

# What I want to obtain is the following
dt_goal <- data.table(common_var = dt1$common_var,
                      condition_var = dt1$condition_var,
                      other_var = dt1$other_var,
                      new_var1 = c(11, NA, NA, 12, NA),
                      new_var2 = c(21, NA, NA, 22, NA))
dt_goal

上面代码中的逻辑查找重复的
不需要的条件情况,并用
NA
替换所选列。这部分起作用,但存在两个问题:

1) 如果要保留的值(
update1
)不在其他重复行中(
b
,在我的示例中),它们也会被擦除

2) 这种方法需要对我想要保留的案例进行硬编码。在我的实际应用程序中,我将循环这种类型的数据准备,条件值将改变。我知道更新数据表的优先级,但:

order_to_populate_dups <- c("update1", "update2", "update3")


order\u to\u populated\u dups请告诉我是否正确理解了您的示例。如果需要,我可以更改解决方案

# order dt1 by the common variable and 
setorder(dt1, common_var, condition_var) condition
# calculate row_id for each group (grouped by common_var)
dt1[, row_index := rowid(common_var)] 
# assume dt2 has only one row per common_var
dt2[, row_index := 1]

# left join on common_var and row_index, reorder columns.
dt3 <- dt2[dt1, on = c('common_var', 'row_index')][, list(common_var, condition_var, other_var, new_var1, new_var2)]
#按公共变量和
设置顺序(dt1、公共变量、条件变量)条件
#计算每个组的行id(按公共变量分组)
dt1[,行索引:=行ID(公共变量)]
#假设dt2每个公共变量只有一行
dt2[,行索引:=1]
#左键连接公共变量和行索引,对列重新排序。

dt3请让我知道我是否正确理解了您的示例。如果需要,我可以更改解决方案

# order dt1 by the common variable and 
setorder(dt1, common_var, condition_var) condition
# calculate row_id for each group (grouped by common_var)
dt1[, row_index := rowid(common_var)] 
# assume dt2 has only one row per common_var
dt2[, row_index := 1]

# left join on common_var and row_index, reorder columns.
dt3 <- dt2[dt1, on = c('common_var', 'row_index')][, list(common_var, condition_var, other_var, new_var1, new_var2)]
#按公共变量和
设置顺序(dt1、公共变量、条件变量)条件
#计算每个组的行id(按公共变量分组)
dt1[,行索引:=行ID(公共变量)]
#假设dt2每个公共变量只有一行
dt2[,行索引:=1]
#左键连接公共变量和行索引,对列重新排序。

dt3您是否正在寻找类似以下内容的内容:

cols <- paste0("new_var", 1:2)
remap <- c(update1=1, update2=2, update3=3)
dt1[, rp := remap[condition_var]]

setkey(dt1, common_var, rp)
dt1[rowid(common_var)==1L, (cols) := 
    dt2[.SD, on=.(common_var), mget(paste0("i.",cols))]

cols您是否正在寻找类似于:

cols <- paste0("new_var", 1:2)
remap <- c(update1=1, update2=2, update3=3)
dt1[, rp := remap[condition_var]]

setkey(dt1, common_var, rp)
dt1[rowid(common_var)==1L, (cols) := 
    dt2[.SD, on=.(common_var), mget(paste0("i.",cols))]


cols我认为你对
new\u var2
的定义有误。可能应该是
c(21,NA,NA,22,NA)
而不是
21,NA,NA,22,NA
,从示例中似乎很难理解条件变量应该如何修复打字错误。对不起,我认为可能导致混淆的是使用
keep1
keep2
等,而不是
update1
update2
。订单向量应该与
条件变量
列下的值匹配。是否仅更新第一次出现的公共变量?如果我可以根据
条件变量
以自定义方式对数据表进行排序,更新第一次出现的内容对每个副本都有效。我认为您对
new\u var2
的定义有误。可能应该是
c(21,NA,NA,22,NA)
而不是
21,NA,NA,22,NA
,从示例中似乎很难理解条件变量应该如何修复打字错误。对不起,我认为可能导致混淆的是使用
keep1
keep2
等,而不是
update1
update2
。订单向量应该与
条件变量
列下的值相匹配。是否仅更新公共变量的第一次出现?如果我可以根据
条件变量
以自定义方式对数据表进行排序,则每重复一次更新第一次出现的值都应该有效。这一点正在接近(虽然我认为第一行有一个拼写错误--
条件
结尾)。请阅读我对上述评论的评论,以澄清我的问题(也编辑了帖子)。我仍然希望使用字符向量指定
条件变量
列的顺序。实际工作应用程序中的顺序不是字母顺序(例如,在编制索引之前,算法应该对
条件变量
应用自定义排序。此外,dt1将有数千列,dt2将有数百列。如何调整这一点,使我们不需要将命名变量作为列表调用传递?这已经很接近了。)(虽然我认为第一行有一个拼写错误--
条件
结尾)。请阅读我对上述评论的评论,以澄清我的问题(也编辑了帖子)。我仍然希望使用字符向量指定
条件变量
列的顺序。实际工作应用程序中的顺序不是字母顺序(例如,在索引之前,算法应该对
条件变量
应用自定义排序。此外,dt1将有数千列,dt2将有数百列。如何进行调整,使我们不需要将命名变量作为列表调用传递?我将尽快对此进行测试,但您能告诉我这是如何工作的吗?我是stiI’我正在努力流利地使用data.table。谢谢!让我们先看看这是不是你想要的。我稍微调整了一下你的代码(基于上面更新的帖子(在
条件下保持
更新
的一致命名)这似乎是可行的:
cols稍后会添加解释,因为这是你想要的。我会尽快测试,但你能告诉我这是如何工作的吗?我仍在尝试流利地使用data.table。谢谢!让我们看看这是否是你想要的。首先我稍微调整了一下你的代码(根据上面更新的帖子(在<代码>条件下<代码>保持<代码>与<代码>更新<代码>的一致命名),这似乎有效:<代码>cols将在稍后添加解释,因为这正是您需要的