如何替换readr包name_repair行为:按重复次数而非列位置编号重复列名
自定义read_csv列名修复:重复列名按出现次数加后缀
问题场景
假设你有如下CSV文件内容:
asdf,qwer,asdf,qwer,qwer 1,2,3,4,5
用readr::read_csv("some.csv")默认读取时,会基于列位置生成带位置标记的重复列名,结果如下:
# A tibble: 1 × 5 asdf...1 qwer...2 asdf...3 qwer...4 qwer...5 <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 2 3 4 5
我们需要实现首次出现的列名不修改,重复出现的按次数添加_数字后缀的效果,最终要得到这样的结果:
# A tibble: 1 × 5 asdf qwer asdf_1 qwer_1 qwer_2 <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 2 3 4 5
解决方案
借助read_csv的name_repair参数,传入自定义函数来实现这个列名修复逻辑:
library(readr) # 自定义列名修复函数 repair_names_sequential <- function(names) { # 统计每个列名的总出现次数 name_counts <- table(names) # 初始化每个列名的计数器 counter <- setNames(rep(0, length(name_counts)), names(name_counts)) # 遍历列名,生成新名称 sapply(names, function(name) { counter[name] <<- counter[name] + 1 if (counter[name] == 1) { # 首次出现保留原名 name } else { # 重复出现的添加_1、_2...后缀 paste0(name, "_", counter[name] - 1) } }) } # 使用自定义函数读取CSV文件 df <- read_csv("some.csv", name_repair = repair_names_sequential) print(df)
运行这段代码后,就能得到符合预期的列名格式。
内容的提问来源于stack exchange,提问作者pietrodito
相关产品推荐
相关产品推荐

