如何在R或Shell中查找冒号分隔的镜像(反向重复)行?
R 实现方法
方法1:Base R 原生函数
拆分字符串生成标准化匹配键,筛选重复键对应的行号:
# 拆分字符串为左右两部分 split_cols <- strsplit(df$unique, ":") # 生成标准化键:将拆分后的两部分排序后重新拼接 standard_keys <- sapply(split_cols, function(x) paste(sort(x), collapse = ":")) # 找出出现次数≥2的键 duplicate_keys <- names(which(table(standard_keys) >= 2)) # 获取对应的行号 target_rows <- which(standard_keys %in% duplicate_keys) target_rows # 输出结果:2 4
方法2:tidyverse 工具链
用separate拆分列,生成标准化键后筛选目标行号:
library(tidyverse) df %>% mutate(row_num = row_number()) %>% separate(unique, into = c("left", "right"), sep = ":") %>% mutate(standard_key = paste(pmin(left, right), pmax(left, right), sep = ":")) %>% group_by(standard_key) %>% filter(n() >= 2) %>% pull(row_num) # 输出结果:2 4
Shell 实现方法
假设数据已保存为data.txt(每行对应df的unique列内容),用awk命令处理:
# 生成带行号的标准化键,统计重复键并提取对应行号 awk -F: '{key = ($1 < $2) ? $1":"$2 : $2":"$1; print key, NR}' data.txt | \ awk '{count[$1]++; line[$1] = line[$1] " " $2} END {for(k in count) if(count[k]>=2) print line[k]}'
执行后输出2 4,即目标行号。
若需从R导出数据到文件,可先执行:
writeLines(df$unique, "data.txt")
内容的提问来源于stack exchange,提问作者Doda
相关产品推荐
相关产品推荐

