如何通过对重复项进行编号而不是按其列位置进行编号来替换读取器包的name_repair行为?

How to replace the name_repair behavior of the readr package by numbering duplicates but not by their column position?

提问人:pietrodito 提问时间:10/12/2023 最后编辑:r2evanspietrodito 更新时间:10/12/2023 访问量:43

问:

假设我有这个 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

提示

似乎可以使用参数并提供函数。name_repairread_csv

r 重命名 读器

评论


答:

6赞 r2evans 10/12/2023 #1

由于可以是一个函数,我们可以以编程方式处理它。幸运的是,它完成了大部分工作,我们可以对其进行自定义以获得您的确切输出。name_repair=base::make.uniquesep="_"

namefun <- function(nm) make.unique(nm, sep = "_")
txt <- 'asdf,qwer,asdf,qwer,qwer
1,2,3,4,5'
readr::read_csv(txt, name_repair = namefun)
# Rows: 1 Columns: 5
# ── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
# Delimiter: ","
# dbl (5): asdf, qwer, asdf_1, qwer_1, qwer_2
# ℹ Use `spec()` to retrieve the full column specification for this data.
# ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# # A tibble: 1 × 5
#    asdf  qwer asdf_1 qwer_1 qwer_2
#   <dbl> <dbl>  <dbl>  <dbl>  <dbl>
# 1     1     2      3      4      5