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将在稍后添加解释,因为这正是您需要的