【问题标题】:Combining multiple csvs with different column names to unique column names将具有不同列名的多个csv组合成唯一的列名
【发布时间】:2021-09-10 02:09:31
【问题描述】:

我想将一个文件夹中的所有 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()

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    你可以试试这个代码 -

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多