You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中将特定格式CSV转换为指定结构的DataFrame?

R语言处理宽格式CSV转目标长格式DataFrame

步骤说明与代码实现

你的CSV属于宽格式数据,前两行定义了每一列的Year和Month属性,后续行是ind对应各列的数值。可以用tidyverse工具包快速转成目标格式,步骤如下:

  1. 读取原始CSV
    注意文件分隔符是|,且存在多余空格,用read.table处理:

    # 替换成你的文件路径
    df_raw <- read.table("your_data.csv", sep = "|", header = FALSE, strip.white = TRUE, stringsAsFactors = FALSE)
    
  2. 提取Year和Month的列属性
    把前两行的内容作为每一列的Year、Month标签:

    # 第一行是各列的Year值,去掉第一列(行标识列)
    year_labels <- df_raw[1, -1]
    # 第二行是各列的Month值
    month_labels <- df_raw[2, -1]
    
  3. 提取核心数据并转长格式
    用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 07:22:24