R中使用data.table批量基于现有变量生成差值、比值新变量
实现方案
核心代码(可直接运行)
library(data.table) # 构造示例数据集(实际使用时替换为自己的数据集即可) dataset <- data.table( root1.x = rnorm(10), root1.y = rnorm(10), root2.x = rnorm(10), root2.y = rnorm(10) ) # 定义需要处理的变量根名称 roots <- c("root1", "root2")
批量生成差值、比值的核心计算代码:
# 预定义变量名 cols_x <- paste0(roots, ".x") cols_y <- paste0(roots, ".y") new_cols <- c(paste0(roots, ".xy_diff"), paste0(roots, ".xy_ratio")) # 单行批量生成所有新变量 dataset[, (new_cols) := c( Map(`-`, mget(cols_x), mget(cols_y)), Map(`/`, mget(cols_x), mget(cols_y)) )]
逻辑说明
mget(cols_x)会按变量名批量取出所有x后缀的列,返回列表格式,和cols_y取出的y后缀列一一对应Map对每一组配对的x/y列执行对应计算,每个计算返回一个列向量,结果天然是:=右侧要求的列表结构- 差值计算结果列表在前、比值计算结果列表在后,和左侧
new_cols的变量顺序完全匹配,赋值不会错位
扩展方法
如果需要新增其他计算逻辑(比如求和、平方差等),只需要调整两个位置即可:
- 在
new_cols中新增对应新变量的命名规则 - 在
:=右侧的拼接列表中新增对应计算的Map块
示例:新增x+y的求和变量:
new_cols <- c(paste0(roots, ".xy_diff"), paste0(roots, ".xy_ratio"), paste0(roots, ".xy_sum")) dataset[, (new_cols) := c( Map(`-`, mget(cols_x), mget(cols_y)), Map(`/`, mget(cols_x), mget(cols_y)), Map(`+`, mget(cols_x), mget(cols_y)) )]
内容的提问来源于stack exchange,提问作者Didifr
相关产品推荐
相关产品推荐

