我想将文件夹中的所有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_code
和Ori_desc
,它们具有两个列名中的值 - 将所有列转换为字符,因为如果我们有混合数据类型的列,我们将无法将它们合并到一个数据集中
- 将前两列重命名为
c('Gen_code', 'Gen_Desc')
- 由于我们使用的是
map_df
,它将把所有文件组合成一个result