在R语言中检测昆虫左右翅文件是否成对存在
检测昆虫翅文件条目是否成对的解决方案
核心思路
通过提取每个翅文件的唯一标识前缀(去除末尾的-L.dw.png或-R.dw.png后缀),统计前缀的出现次数,次数不为2的即为未成对条目;也可按奇偶行的配对规则直接检查相邻行的前缀一致性。
方法一:全局统计前缀出现次数
适用于不依赖行顺序的场景,能检测所有缺漏、重复的未成对情况:
- 读取数据
wings <- read.table("https://zenodo.org/record/6950928/files/AT-raw-coordinates.csv", header = TRUE, sep = ";")
- 提取唯一标识前缀
用正则表达式去掉文件名末尾的翅型后缀:
wings$prefix <- gsub("-(L|R)\\.dw\\.png$", "", wings$file)
- 统计并筛选未成对条目
# 统计每个前缀的出现次数 prefix_counts <- table(wings$prefix) # 找出出现次数≠2的前缀 unpaired_prefixes <- names(prefix_counts[prefix_counts != 2]) # 查看所有未成对的完整条目 unpaired_entries <- wings[wings$prefix %in% unpaired_prefixes, ] print(unpaired_entries)
方法二:按奇偶行配对检查
针对你提到的「奇数行左翅、偶数行右翅」规则,直接检查每一对的前缀是否一致:
# 生成配对组编号(每2行为一组) pair_groups <- ceiling(seq_len(nrow(wings)) / 2) # 检查每组内的前缀是否唯一(即左右翅属于同一样本) valid_pairs <- tapply(wings$prefix, pair_groups, function(x) length(unique(x)) == 1) # 找出无效配对组 invalid_groups <- names(valid_pairs[!valid_pairs]) # 查看无效组的所有条目 unpaired_by_row <- wings[ceiling(seq_len(nrow(wings)) / 2) %in% invalid_groups, ] print(unpaired_by_row) # 额外检查:如果总行数为奇数,最后一行必然未成对 if (nrow(wings) %% 2 != 0) { cat("注意:数据总行数为奇数,最后一行无配对条目:\n") print(tail(wings, 1)) }
说明
- 方法一能覆盖所有异常情况(如单个翅重复录入、某一样本仅存单翅);
- 方法二更贴合你描述的行顺序规则,能快速定位到配对错误的行组。
内容的提问来源于stack exchange,提问作者H Kaur
相关产品推荐
相关产品推荐

