r-将多个具有不同列名的csv组合为唯一的列名

  • 本文关键字:csv 组合 唯一 r dplyr tidyverse
  • 更新时间 :
  • 英文 :


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

你可以试试这个代码-

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

最新更新