在R data.table中通过字符向量批量实现列间除法运算
在data.table中批量生成列除法结果的正确方法
你遇到的报错是因为mget()返回的是列表对象,R无法直接对两个列表执行除法运算。下面是几种可行的批量实现方案:
方案1:使用Map()逐对处理列
Map()可以将除法函数逐个应用到对应列对,返回的结果列表正好匹配新列的赋值需求:
cc <- c('x1', 'x2') icc <- paste0('i.', cc) new_c <- paste0(cc, '_n') dt2[, (new_c) := Map(`/`, mget(cc), mget(icc))]
方案2:结合.SD与lapply()遍历列索引
利用.SD选取目标列后,通过索引逐个匹配列对并计算:
dt2[, (new_c) := lapply(seq_along(cc), function(i) { .SD[[cc[i]]] / .SD[[icc[i]]] }), .SDcols = c(cc, icc)]
方案3:使用set()循环赋值(适合大数据集)
如果你的数据列数极多,set()函数的循环赋值效率更高,避免复制整个数据集:
for (i in seq_along(cc)) { set(dt2, j = new_c[i], value = dt2[[cc[i]]] / dt2[[icc[i]]]) }
执行任意一种方案后,dt2都会生成x1_n和x2_n列,对应原列与前缀为i.的列的除法结果。
内容的提问来源于stack exchange,提问作者gabagool
相关产品推荐
相关产品推荐

