r - 将具有不同列名的多个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()
解决方案
你可以试试这个代码 -
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
.
推荐阅读
- php - 如何将数组中的键设置为php中的值(来自对象)
- android - 格式化时间的最佳方式尊重区域设置和用户的 24 小时偏好
- reactjs - React router 嵌套路由和数据展示
- c++ - cuda c++奇偶排序实现
- angular - 路由器插座和我的路由模块的问题
- angular - 如果从 CDN 提供 Angular 应用程序,--deploy-url 是否会动态调整基本 URL?
- reactjs - 如何将 useState 方法传递给组件并且该组件返回状态?
- php - PHP - 即使我填写了必填字段,也会出现验证消息
- sql - 运算符不存在:文本 ->> 未知
- php - 通过 PHP 使用 FORM 上传整个文件