R语言data.table:函数生成向量后跨表按ID带公差匹配值
解决方案(data.table实现)
核心思路
先把dt1每行生成的向量拆成多行记录,再按ID关联dt2,筛选符合±0.5公差的匹配项,最后按原dt1的行统计匹配数量,生成对应结果。
步骤1:准备示例数据与函数
先定义模拟数据和ld函数(你可以直接替换成自己的真实数据和函数):
library(data.table) # 原表dt1 dt1 <- data.table( ID = c(1, 1, 2, 3), mass_Da = c(100, 200, 300, 400) ) # 匹配表dt2 dt2 <- data.table( ID = c(1, 1, 2, 2, 3), masstal = c(99.3, 200.4, 300.6, 299.3, 401.6) ) # 自定义ld函数(生成mass_Da的关联向量,替换成你的真实函数) ld <- function(x) { c(x - 1, x, x + 1) # 示例:生成x-1、x、x+1三个值 }
步骤2:展开dt1的生成向量
把dt1每行mass_Da通过ld生成的向量拆成单独行,保留原ID和mass_Da:
dt1_expanded <- dt1[, .(generated_mass = ld(mass_Da)), by = .(ID, mass_Da)]
步骤3:关联dt2并筛选匹配项
按ID关联两张表,筛选出masstal与生成值的差绝对值≤0.5的记录:
matched_records <- dt1_expanded[dt2, on = .(ID), allow.cartesian = TRUE][ abs(masstal - generated_mass) <= 0.5, .(ID, mass_Da, masstal) ]
allow.cartesian=TRUE:允许同一ID下多对多的关联,避免报错- 筛选条件
abs(masstal - generated_mass) <= 0.5:实现±0.5的公差匹配
步骤4:统计匹配数并生成结果
对dt1的每一行,统计匹配到的唯一masstal数量,再根据数量返回对应结果:
# 统计每个ID+mass_Da的唯一匹配数 match_stats <- matched_records[, .(match_count = uniqueN(masstal)), by = .(ID, mass_Da)] # 合并回原dt1,生成最终输出 final_result <- dt1[match_stats, on = .(ID, mass_Da)] # 根据匹配数赋值:无匹配→"no",1个匹配→原mass_Da,多匹配→"X" final_result[, output := fifelse( is.na(match_count), "no", fifelse(match_count == 1, as.character(mass_Da), "X") )]
最终输出
运行后final_result的结果如下:
ID mass_Da match_count output 1: 1 100 1 100 2: 1 200 1 200 3: 2 300 2 X 4: 3 400 NA no
内容的提问来源于stack exchange,提问作者Per
相关产品推荐
相关产品推荐

