gpt4 book ai didi

r - 基于列名模式的多个成对差异

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

我有一个data.table, dt:

dt

Id v1 v2 v3 x1 x2 x3
1 7 1 3 5 6 8
2 1 3 5 6 8 5
3 3 5 6 8 5 1

v1、v2、v3和x1、x2、x3都是数值型变量

我想从“v”列中减去“x”列,即计算差值 v1 - x1v2 - x2 等。在我的真实世界中data 我可能有 100 个这样的变量对。

期望的输出:

dt

Id v1 v2 v3 x1 x2 x3 diff1 diff2 diff3
1 7 1 3 5 6 8 -2 -4 -3
2 1 3 5 6 8 5 -5 -5 0
3 3 5 6 8 5 1 -3 0 5


我尝试了以下方法:

newnames <- paste0("diff", 1:3)
v <- paste0("v", 1:3)
x <- paste0("x", 1:3)
dt[ , c(newnames) := get(v) - get(x)]

但是,这会导致 3 个相同的列都包含差异 v1 - x1

我知道一个可能的解决方案是这样的

dt[ , .(v1 - x1, v2 - x2, v3 - x3)]

然而,如果我必须输入 100 个不像 v1 和 x1 那样简单的名称,那么这是一段很长的代码,可能会出现很多打字错误。

我希望你能帮助我。

最佳答案

您可以根据列是否包含 x 进行拆分,然后对结果数据表进行差分。

new_cols <- 
do.call('-', split.default(dt[,-1], grepl('x', names(dt)[-1])))

dt[, paste0('diff', seq_along(new_cols)) := new_cols]

dt
# Id v1 v2 v3 x1 x2 x3 diff1 diff2 diff3
# 1: 1 7 1 3 5 6 8 2 -5 -5
# 2: 2 1 3 5 6 8 5 -5 -5 0
# 3: 3 3 5 6 8 5 1 -5 0 5

或者使用与您可以执行的问题中的代码片段类似的逻辑

newnames <- paste0("diff",1:3)
v <- paste0("v",1:3)
x <- paste0("x",1:3)

dt[, (newnames) := Map('-', mget(v), mget(x))]

dt
# Id v1 v2 v3 x1 x2 x3 diff1 diff2 diff3
# 1: 1 7 1 3 5 6 8 2 -5 -5
# 2: 2 1 3 5 6 8 5 -5 -5 0
# 3: 3 3 5 6 8 5 1 -5 0 5

关于r - 基于列名模式的多个成对差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62043917/

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