R语言多数据框全连接后如何去除列名的.x/.y重复后缀?
解决多数据框全连接后列名带.x/.y后缀的问题
当多个CSV数据框按指定列全连接后,非连接列重名会被自动添加.x/.y/.x.x这类后缀,解决办法分两种场景:
场景1:重名列是同含义字段(比如不同文件里的A列都是同一个属性)
这种情况没必要保留重复列,直接合并成原始列名即可,推荐用行绑定后聚合的方式,比全连接更高效:
library(dplyr) library(purrr) # 读取文件列表 file.list <- c("file1.csv", "file2.csv", "file3.csv", "file4.csv") df.list <- lapply(file.list, read.csv) # 合并所有数据框,按连接列分组提取有效数据 data <- bind_rows(df.list) %>% group_by(Country, Name, Race) %>% summarise(across(everything(), ~first(na.omit(.))), .groups = "drop")
bind_rows会自动把同名列合并成一列,缺失值保留;之后按连接列分组,用first(na.omit(.))取每组里非缺失的有效数据(如果同一组有多条记录,优先取非空值)。
场景2:必须用全连接(或重名列含义不同)
方式A:连接后批量去除后缀
如果已经完成全连接,直接用正则表达式批量清理列名:
# 执行全连接 data <- df.list %>% reduce(full_join, by=c("Country", "Name", "Race")) # 去掉列名末尾的.x/.y/.x.x这类后缀 names(data) <- gsub("\\.[xy]+$", "", names(data))
正则\\.[xy]+$会匹配列名末尾所有连续的.x/.y组合,直接替换为空。
方式B:连接前给列名加来源前缀(适合重名列含义不同)
如果不同文件的重名列是不同属性,先给列名加专属前缀再连接,避免混淆:
# 给每个数据框的非连接列加来源前缀 df.list_named <- map2(df.list, paste0("file", 1:4), function(df, prefix) { non_join_cols <- setdiff(names(df), c("Country", "Name", "Race")) rename_with(df, ~paste0(prefix, "_", .), all_of(non_join_cols)) }) # 执行全连接 data <- df.list_named %>% reduce(full_join, by=c("Country", "Name", "Race"))
这样连接后的列名会是file1_A、file2_A这种,既不会重复,也能明确字段来源。
内容的提问来源于stack exchange,提问作者Loki123
相关产品推荐
相关产品推荐

