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

2023-12-13

我有一个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 - x1, v2 - x2等等。在我的真实数据中,我可能有数百个这样的变量对。

期望的输出:

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于列名称模式的多个成对差异 的相关文章

随机推荐

  • 如何使用codeigniter框架在jquery中读取csv文件

    假设这是我的 csv 文件 fileempId lastName firstName middleName street1 street2 city state zip gender birthDate ssn empStatus join
  • 错误:PermissionUtils 包不存在

    我想通过我的应用程序找到用户的当前位置 我从 Github 复制了源代码 我不知道它不会给我任何错误 但这个错误 这是我的所有库的代码 以防您认为我错过了一个库 import com google android gms maps Goog
  • 根据命名向量更改列名称 (R)

    我有以下数据框 a b c d e f g h i j 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 以及以下向量 或数据框
  • Google 电子表格“=QUERY” join() 等效函数?

    这个问题是关于使用 QUERY 函数在 Google 电子表格中连接两个数据库 我有一个像这样的表 范围为 A1 C3 a d g b e h c f i 我还有另一张桌子 c j m a k n b l o 我希望决赛桌看起来像这样 a
  • Google 容器引擎 Kubernetes 服务 LoadBalancer 是否将流量发送到无响应的主机?

    问 Kubernetes 通过 Google Container Engine 创建的 Google Cloud 网络 LoadBalancer 是否会将流量发送到未监听的主机 此目标池没有运行状况检查 因此流量将发送到所有实例 无论其状态
  • 如何使用cURL发送Cookies?

    我读到了使用 cURL 发送 cookie有效 但不适合我 我有一个像这样的 REST 端点 class LoginResource restful Resource def get self print session if USER T
  • C++“返回局部变量的引用”

    我在使用此函数时遇到错误 说 警告 对局部变量 final 的引用返回 任何想法有什么问题吗 以及如何修复它 vector
  • 一种在 MVC 中封装(添加隐私)模型的方法?

    我为我的模型和单个控制器命名空间 如下所示 var MC 然后根据需要添加属性 例如 初始化所有模型的代码如下所示 MC initAll function MC MASettings init MC MATweet init MC MUse
  • 如何通过短信检索 GPS 位置

    我制作了一个应用程序 可以为我提供 Android 手机的位置 现在我想做一个方法 帮助我通过短信检索手机的 GPS 位置 纬度经度或地址 如果可能 例如 电话号码 558899 我向 558899 发送一条包含 获取位置 的短信 并收到一
  • 解析存储在 Oracle 表中的 XML 字符串

    我的数据库中存储了一个类似的 XML 字符串
  • 如何在 gnuplot 处理的任何时间获取特定行中特定列的值?

    我得到了一个格式如下的数据文件 begin 16 1 15 2 14 3 13 4 12 5 11 6 现在我想使用 gnuplot 通过点画一条线 1 16 16 2 16 15 3 16 14 6 16 11 如您所见 x 轴是范围 1
  • 非常简单的 C# CSV 阅读器

    我想从 CSV 文件创建一个数组 这就像您想象的一样简单 CSV 文件只有一行和这些值 Device SignalStrength Location Time Age 我想将这些值放入一维数组中 我尝试了一些示例 但它们都比所需的更复杂 您
  • 列出当前进程中的所有线程?

    我正在尝试实现一个系统调用 它允许我获取当前进程的线程数 我是Linux内核的新手 所以我对它的理解很有限 目前 我正在尝试迭代所有task structs 并将它们的线程组领导者的PID与当前线程组领导者的PID进行比较 int nthr
  • 如何获取JFrame中的所有元素?

    我有这段代码来获取我需要的所有元素并进行一些处理 问题是我需要指定每个面板 我必须获取其中的元素 for Component c panCrawling getComponents processing for Component c pa
  • 如何将导航道具从父组件传递到标头?

    我有 4 个页面 App js HomeScreen js Login js Toolbar js 我的应用程序页面与 StackNavigator import React Component from react import Plat
  • UITableView滑动删除不确认

    关于 UITableView 中滑动删除功能的快速问题 有没有办法直接删除行而不显示 删除 按钮并等待用户确认 实现您的自定义 UITableViewCell 并利用UISwipe手势识别器 您必须自己编写所有逻辑 协议 委托等 但您将可以
  • 簇块异常

    我使用清晰的语言来构建我的聊天机器人 https github com samtecspg 铰接 当我执行时出现以下错误docker compose up api 1 api 1 usr src app server index js 33
  • 断言错误:302!= 200

    我尝试在我的tests py中创建一个测试 class TaskViewTests TestCase def test task view with no task self If no task exist an appropriate
  • SQL Server 2008 中的小时和分钟总和

    我写了一个查询 但它没有给出正确的答案 我想像这样显示 5小时58分钟 7小时58分钟 13小时56分钟 答案应该13 56 但是下面的查询给出15 09 请回复我任何其他解决方案 这里Effort1是 5 小时专栏 Effort1Minu
  • 基于列名称模式的多个成对差异

    我有一个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 列中减去