首页 > 解决方案 > 将具有不同列名的多个csv组合成唯一的列名

问题描述

我想将一个文件夹中的所有 csv 文件合并到一个普通的 csv 文件中。这些文件具有不同的列名,但格式独特(每个文件中有两列——一列有代码,另一列有描述)。需要以整洁的方式开发一个包含所有具有唯一列名的文件的通用 csv 文件。

文件夹如下:

setwd("folder location")
file1 <- read.csv("file1.csv")
file2 <- read.csv("file2.csv")

为了重现性:

file1 <- read.table(header=TRUE, text="
                   A_code    A_desc 
                   n    15-24 
                   n    15-24
                   n    15-24
                   t    25-34 
                   p    35-44 
                   k    65-74
                   l    45-54
                   ")
file1
  A_code A_desc
1      n  15-24
2      n  15-24
3      n  15-24
4      t  25-34
5      p  35-44
6      k  35-44
7      l  45-54

file2 <- read.table(header=TRUE, text="
                   M_code    M_desc 
                   p    new 
                   p    new
                   p    new
                   a    old 
                   b    medium 
                   b    medium 
                   ")

file2
  M_code M_desc
1      p    new
2      p    new
3      p    new
4      a    old
5      b medium
6      b medium

理想的输出将如下所示:

   Gen_code Gen_Desc Ori_code Ori_desc
1         n    15-24   A_code   A_desc
2         n    15-24   A_code   A_desc
3         n    15-24   A_code   A_desc
4         t    25-34   A_code   A_desc
5         p    35-44   A_code   A_desc
6         k    65-74   A_code   A_desc
7         l    45-54   A_code   A_desc
8         p      new   M_code   M_desc
9         p      new   M_code   M_desc
10        p      new   M_code   M_desc
11        a      old   M_code   M_desc
12        b   medium   M_code   M_desc
13        b   medium   M_code   M_desc

到目前为止,我能够执行以下操作,但这不是我需要的。

path="folder location"
directory() %>%
  filter(endsWith(path, ".csv")) %>%
  select(path) %>% 
  mutate(data = purrr::map(path, read_csv)) %>%
  unnest()

标签: rdplyrtidyverse

解决方案


你可以试试这个代码 -

library(tidyverse)

directory() %>%
  filter(endsWith(path, ".csv")) %>%
  pull(path) %>%
  map_df(~{
    .x %>%
      read_csv %>%
      mutate(Ori_code = names(.)[1], 
             Ori_desc = names(.)[2],
             across(.fns = as.character)) %>%
      rename_with(~c('Gen_code', 'Gen_Desc'), 1:2)
  }) -> result

result

里面的代码map_df是每个文件重复的内容。

  • 读取 csv
  • 创建两个新列Ori_codeOri_desc其值来自两个列名。
  • 将所有列转换为字符,因为如果我们有混合数据类型的列,我们将无法将它们合并到一个数据集中。
  • 将第一两列重命名为c('Gen_code', 'Gen_Desc').
  • 由于我们正在使用map_df它将所有文件合并为一个result.

推荐阅读