R语言如何按第一列终点名称分组排序合并两个同结构文本文件
R实现同终点分组合并+按后缀数字排序的解决方案
以下是直接可用的实现代码,不需要逐个匹配终点名称,通过拆分第一列的内容自动完成分组和排序逻辑:
依赖工具推荐
优先使用tidyverse套件(包含dplyr、stringr)实现,逻辑更清晰,也附带base R的实现方案。
实现步骤
第一步:读入两个文件,新增辅助列
假设两个文件第一列的列名为endpoint_id,如果你的实际列名不同,替换对应位置即可:
# 加载依赖包 library(tidyverse) # 读入文件,替换为你的实际文件路径 df1 <- read.delim("第一个文件路径", stringsAsFactors = FALSE) df2 <- read.delim("第二个文件路径", stringsAsFactors = FALSE) # 处理第一个文件,新增辅助列 df1 <- df1 %>% mutate( endpoint_prefix = str_remove(endpoint_id, ":\\d+$"), # 提取纯终点名称,作为分组依据 suffix_num = as.integer(str_extract(endpoint_id, "\\d+$")), # 提取冒号后的数字,作为排序依据 source = 1 # 标记来源,保证同数字的行第一个文件的排在前面 ) # 用同样逻辑处理第二个文件 df2 <- df2 %>% mutate( endpoint_prefix = str_remove(endpoint_id, ":\\d+$"), suffix_num = as.integer(str_extract(endpoint_id, "\\d+$")), source = 2 )
第二步:合并+按规则排序
merged_df <- bind_rows(df1, df2) %>% # 先按终点名称分组,再按后缀数字升序,同数字的来源为1的排在前面 arrange(endpoint_prefix, suffix_num, source) %>% # 不需要辅助列可以删除,需要保留的话删掉这一行即可 select(-endpoint_prefix, -suffix_num, -source)
可选:base R 实现方案
如果不想安装额外包,用R原生函数也可以实现:
# 读入文件 df1 <- read.delim("第一个文件路径", stringsAsFactors = FALSE) df2 <- read.delim("第二个文件路径", stringsAsFactors = FALSE) # 给df1加辅助列 df1$endpoint_prefix <- sub(":\\d+$", "", df1$endpoint_id) df1$suffix_num <- as.integer(sub("^.+:(\\d+)$", "\\1", df1$endpoint_id)) df1$source <- 1 # 给df2加辅助列 df2$endpoint_prefix <- sub(":\\d+$", "", df2$endpoint_id) df2$suffix_num <- as.integer(sub("^.+:(\\d+)$", "\\1", df2$endpoint_id)) df2$source <- 2 # 合并排序 merged_df <- rbind(df1, df2) merged_df <- merged_df[order(merged_df$endpoint_prefix, merged_df$suffix_num, merged_df$source), ] # 删除辅助列(可选) merged_df <- merged_df[, !names(merged_df) %in% c("endpoint_prefix", "suffix_num", "source")]
验证提示
合并完成后可以用table(merged_df$endpoint_prefix)验证每个终点的行数是否为65+8=73行,确认合并逻辑正确。
内容的提问来源于stack exchange,提问作者HKJ3
相关产品推荐
相关产品推荐

