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

