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

R语言如何查找分子量差值为162±0.5的关联数据行并做标记

实现方法

2万条数据不建议用嵌套循环,会非常慢,以下提供两种高效实现方案:


方案1:data.table实现(推荐,适合大数据量)

data.table的非等值连接效率极高,处理2万条数据耗时不到1秒,内存占用也更低。

library(data.table)
# 示例数据
ID <- c(1,2,3,4,5)
MASS <- c(324,162,508,675,670)
d <- data.frame(ID, MASS)
setDT(d)

# 筛选符合质量差要求的ID对
pair <- d[d, on = .(MASS >= MASS - 162.5, MASS <= MASS - 161.5), 
          .(ID1 = i.ID, ID2 = x.ID)][ID1 != ID2]
# 去重,统一按小ID在前拼接配对字符串
pair[, `:=`(min_id = pmin(ID1, ID2), max_id = pmax(ID1, ID2))]
pair <- unique(pair[, .(min_id, max_id)])
pair[, pair_str := paste(min_id, max_id, sep = "&")]

# 匹配回原数据表
d[, DIFF := as.character(0)]
for(i in 1:nrow(pair)){
  d[ID %in% c(pair$min_id[i], pair$max_id[i]), DIFF := pair$pair_str[i]]
}

运行后输出结果和你给出的预期完全一致。


方案2:基础R实现(适合小数据量调试)

如果不想引入额外依赖,小数据量可以用基础R的距离矩阵实现:

# 示例数据
ID <- c(1,2,3,4,5)
MASS <- c(324,162,508,675,670)
d <- data.frame(ID, MASS)

# 计算所有两两质量差的绝对值
dist_mat <- as.matrix(dist(d$MASS, method = "manhattan"))
# 筛选差值符合要求的配对,去重
valid_pairs <- which(dist_mat >= 161.5 & dist_mat <= 162.5, arr.ind = TRUE)
valid_pairs <- valid_pairs[valid_pairs[,1] < valid_pairs[,2], ]

# 初始化DIFF列并填充
d$DIFF <- "0"
for(i in 1:nrow(valid_pairs)){
  id1 <- d$ID[valid_pairs[i,1]]
  id2 <- d$ID[valid_pairs[i,2]]
  pair_str <- paste(id1, id2, sep = "&")
  d$DIFF[c(valid_pairs[i,1], valid_pairs[i,2])] <- pair_str
}

注意事项

如果存在单个ID和多个ID都符合差值要求的情况,可调整拼接逻辑,用分号分隔多个配对ID即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 09:45:05