You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在data.table中基于列值匹配向量创建新计算列?

解决data.table中按列匹配常量生成新列的报错问题

问题描述

需要在data.table中创建新列,新列值为指定列的值加上另一列对应名称的常量:

  • 现有包含position_on_chrom(染色体位置)和chromosome(染色体名)的data.table,要生成real_position_in_genome列,值为position_on_chrom加上对应染色体的起始位置
  • 染色体起始位置存储在命名列表/向量中,名称为染色体名,值为起始位置

尝试执行代码时出现报错:

Error in ..chromstart[[chr]] :
Attempt to choose more then one element from vectorIndex

简化示例代码

library(data.table)

items <- c("Item1", "Item2", "Item3", "Item4")
positions <- c("1234", "2345", "1234", "1652")
container <- c("con1", "con2", "con2", "con3")

dt <- data.table(Item = items,
                 Position = positions,
                 Container = container)

starting_position <- c("0", "200", "500")
names(starting_position) <- c("con1", "con2", "con3")

# 触发报错的代码
dt[, total_position := as.numeric(Position) +
     as.numeric(..starting_position[[Container]])]

错误原因

[[仅支持提取单个元素,但Container是包含多个值的向量,直接用..starting_position[[Container]]会试图一次性提取多个元素,因此触发报错。

正确实现方法

方法1:利用命名向量的索引特性

直接用Container向量作为命名向量starting_position的索引,会自动匹配每个元素对应的常量:

dt[, total_position := as.numeric(Position) + as.numeric(starting_position[Container])]

方法2:使用mapvalues实现映射(需plyr包)

如果需要更直观的映射逻辑,可以用plyr::mapvalues完成匹配替换:

library(plyr)
dt[, total_position := as.numeric(Position) + 
     as.numeric(mapvalues(Container, from = names(starting_position), to = starting_position))]

最终结果验证

执行正确代码后,dt的输出结果为:

Item Position Container total_position
1: Item1     1234      con1           1234
2: Item2     2345      con2           2545
3: Item3     1234      con2           1434
4: Item4     1652      con3           2152

内容的提问来源于stack exchange,提问作者gernophil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 17:48:29