You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:42:35