R语言如何编写多条件循环匹配两个dataframe的染色体坐标并计算距离
R语言双数据框染色体坐标匹配修正方案
原代码核心问题
- 条件判断
df$chr[i] == df1$chr为单个值与向量比较,返回逻辑向量而非单一布尔值,判断逻辑失效且会抛出警告 - 未限制坐标计算范围,每次循环都对全量坐标做
outer运算,没有仅针对当前匹配到的同染色体记录计算,逻辑完全错误 - 计算生成的结果未赋值给变量存储,循环运行结束后无任何可输出的结果
循环版修改实现
# 初始化结果存储数据框 result <- data.frame( chr = integer(), coord1 = integer(), distance = integer() ) for (i in 1:nrow(df)) { # 筛选df1中与当前df记录染色体号一致的行 same_chr_pos <- which(df1$chr == df$chr[i]) if (length(same_chr_pos) == 0) next # 仅对同染色体的坐标计算差值 dist_val <- abs(df$coord[i] - df1$coord[same_chr_pos]) # 筛选差值在±10以内的记录 match_pos <- same_chr_pos[dist_val <= 10] if (length(match_pos) == 0) next # 拼接结果 tmp <- data.frame( chr = df$chr[i], coord1 = df1$coord[match_pos], distance = dist_val[dist_val <= 10] ) result <- rbind(result, tmp) } # 查看输出结果 print(result)
运行输出与你要求的示例完全一致:
chr coord1 distance 1 2 110 2
更高效的非循环实现(推荐)
如果数据量较大,推荐使用dplyr包的关联逻辑实现,代码更简洁执行效率更高:
library(dplyr) result <- inner_join(df, df1, by = "chr", suffix = c("_df", "_df1")) %>% mutate(distance = abs(coord_df - coord_df1)) %>% filter(distance <= 10) %>% select(chr, coord1 = coord_df1, distance)
内容的提问来源于stack exchange,提问作者Greck9
相关产品推荐
相关产品推荐

