如何在R中将特定格式CSV转换为指定结构的DataFrame?
R语言处理宽格式CSV转目标长格式DataFrame
步骤说明与代码实现
你的CSV属于宽格式数据,前两行定义了每一列的Year和Month属性,后续行是ind对应各列的数值。可以用tidyverse工具包快速转成目标格式,步骤如下:
读取原始CSV
注意文件分隔符是|,且存在多余空格,用read.table处理:# 替换成你的文件路径 df_raw <- read.table("your_data.csv", sep = "|", header = FALSE, strip.white = TRUE, stringsAsFactors = FALSE)提取Year和Month的列属性
把前两行的内容作为每一列的Year、Month标签:# 第一行是各列的Year值,去掉第一列(行标识列) year_labels <- df_raw[1, -1] # 第二行是各列的Month值 month_labels <- df_raw[2, -1]提取核心数据并转长格式
用tidyverse的pivot_longer把宽格式转成需要的长格式,同时匹配Year和Month:# 先加载tidyverse(新手建议提前安装:install.packages("tidyverse")) library(tidyverse) # 提取从第三行开始的ind和数值数据 data_rows <- df_raw[3:nrow(df_raw), ] # 给列命名,方便后续处理 colnames(data_rows) <- c("ind", paste0("col_", 1:length(year_labels))) # 转长格式并匹配Year/Month final_df <- data_rows %>% # 把所有数值列转成value,记录列标识 pivot_longer(cols = starts_with("col_"), names_to = "col_idx", values_to = "value") %>% # 把value转成数值类型 mutate(value = as.numeric(value)) %>% # 根据列标识匹配对应的Year和Month mutate(Year = year_labels[as.integer(str_remove(col_idx, "col_"))], Month = month_labels[as.integer(str_remove(col_idx, "col_"))]) %>% # 调整列顺序,保留需要的字段 select(Year, Month, ind, value)
补充说明
- 如果需要把
ind转成整数类型,在mutate里加一行ind = as.integer(ind)即可 - 若不想用
tidyverse,也可以用base R的reshape函数,但代码相对繁琐,新手更推荐tidyverse的直观写法
内容的提问来源于stack exchange,提问作者Dododude
相关产品推荐
相关产品推荐

