如何在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
相关产品推荐
相关产品推荐

