多CSV文件读取合并及数据重排技术求助
问题:合并多个CSV文件并重塑数据格式
我有一个文件夹里的多个CSV文件,每个文件的数据格式如下(头部是用户信息,后续是成对的日期和数值列,对应col1-col4):
Name: John Los Angeles CA col1 col2 col3 col4 12/1/14 1:00 AM 13 12/5/14 1:00 AM 19 12/7/14 1:00 AM 32 12/11/14 1:00 AM 13 12/2/14 1:00 AM 91 12/6/14 1:00 AM 20.9 12/8/14 1:00 AM 111.9 12/7/14 1:00 AM 22.8 12/9/14 1:00 AM 22.8 12/8/14 1:00 AM 24.7 12/10/14 1:00 AM 24.7 12/11/14 1:00 AM 0
我需要把所有文件合并成单个DataFrame,并且将每一对(日期+数值)的数据上下堆叠,最终格式如下:
Date value variable Name city State file_name 12/1/14 1:00 AM 13 col1 John Los Angeles CA file 12/2/14 1:00 AM 91 col1 John Los Angeles CA file 12/5/14 1:00 AM 19 col2 John Los Angeles CA file 12/6/14 1:00 AM 20.9 col2 John Los Angeles CA file ... 12/11/14 1:00 AM 33 col1 hayes SD CA file_1
我已经尝试用raw = read.csv("file1.csv",header = T,skip = 1),但不知道接下来该怎么处理,希望得到帮助。
解决方案(R语言实现)
我给你整理了一套分步处理的方案,刚好匹配你用read.csv的R环境:
1. 加载必要的工具包
我们需要用到dplyr和tidyr做数据重塑,fs来批量获取文件列表,先安装并加载:
# 如果没安装过这些包,先运行这行 install.packages(c("dplyr", "tidyr", "fs")) library(dplyr) library(tidyr) library(fs)
2. 编写单个CSV文件的处理函数
你的CSV格式比较特殊,头部是用户信息,后面是成对的日期+数值,所以先写一个函数来单独处理每个文件:
process_single_file <- function(file_path) { # 读取第一行内容,拆分出用户信息和变量名 first_line <- readLines(file_path, n = 1) %>% strsplit(" ") %>% unlist() # 提取用户的Name、城市、州信息 name_label_idx <- which(first_line == "Name:") Name <- first_line[name_label_idx + 1] # 这里假设城市是两个单词(比如Los Angeles),如果是单个单词就改成first_line[name_label_idx + 2] city <- paste(first_line[name_label_idx + 2], first_line[name_label_idx + 3]) State <- first_line[name_label_idx + 4] # 提取变量名col1到col4 variable_names <- first_line[which(first_line == "col1"):which(first_line == "col4")] # 读取数据部分:跳过第一行,把所有数据拆成单个元素,然后两两分组为日期和数值 data_elements <- readLines(file_path, skip = 1) %>% strsplit(" ") %>% unlist() data_df <- tibble( Date = data_elements[seq(1, length(data_elements), 2)], value = as.numeric(data_elements[seq(2, length(data_elements), 2)]) ) # 给每行分配对应的变量名:每个变量对应相同数量的行,重复变量名即可 rows_per_variable <- nrow(data_df) / length(variable_names) data_df <- data_df %>% mutate(variable = rep(variable_names, each = rows_per_variable)) %>% # 添加用户信息和当前文件名 mutate( Name = Name, city = city, State = State, file_name = path_file(file_path) ) return(data_df) }
3. 批量处理所有文件并合并
接下来批量读取文件夹里的所有CSV文件,用上面的函数处理后合并成一个完整的DataFrame:
# 替换成你的CSV文件夹路径,比如"./my_csv_files" csv_folder_path <- "your_csv_folder_path" # 获取文件夹中所有CSV文件的路径 all_csv_files <- dir_ls(csv_folder_path, regexp = "\\.csv$") # 批量处理所有文件并合并结果 final_merged_data <- purrr::map_dfr(all_csv_files, process_single_file) # 调整列顺序为你想要的格式 final_merged_data <- final_merged_data %>% select(Date, value, variable, Name, city, State, file_name)
小提示
- 如果你的城市名称是单个单词(不是像Los Angeles这样的双词),记得修改提取
city的代码,把paste(...)改成first_line[name_label_idx + 2]即可 - 处理完成后,可以用
write.csv(final_merged_data, "merged_result.csv", row.names = FALSE)把结果保存成新的CSV文件
内容的提问来源于stack exchange,提问作者suny
相关产品推荐
相关产品推荐

