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

如何用R读取列名在第12行的多CSV文件,指定列、加文件名后合并?

优雅的非循环解决方案(基于data.table和tidyverse)

针对你处理多CSV文件的需求,这里提供两种比循环更高效、更简洁的非循环实现方案,完美匹配你的数据处理逻辑:

方案一:基于data.table(推荐,大文件场景更高效)

利用data.table的fread(高速读取文件)和rbindlist(高效合并列表)特性,直接在读取阶段完成列选择和文件名添加:

library(data.table)

# 设置工作路径
setwd("D:/Data")

# 获取所有CSV文件名
files <- list.files(pattern = "\\.csv$", full.names = FALSE)

# 读取、处理并合并所有文件
final_dt <- rbindlist(
  lapply(files, function(file) {
    # 读取文件:从第12行开始(skip=11),指定分隔符和编码
    dt <- fread(file, skip = 11, sep = "\t", fileEncoding = "utf-16")
    # 保留指定列,新增文件名列
    dt[, .(File = file, Date, Time, Value)]
  })
)

# 如需转为data.frame格式
final_df <- as.data.frame(final_dt)

方案二:基于tidyverse(代码可读性更强)

用purrr::map_dfr自动合并数据框,结合dplyr完成列筛选和新增列操作:

library(tidyverse)

setwd("D:/Data")
files <- list.files(pattern = "\\.csv$", full.names = FALSE)

final_df <- map_dfr(files, function(file) {
  read_delim(file, 
             skip = 11, 
             delim = "\t", 
             locale = locale(encoding = "utf-16")) %>%
    select(Date, Time, Value) %>%
    mutate(File = file) %>%
    relocate(File) # 将File列移至最前,与你原循环结果结构一致
})

关键优化说明

  • 避免了循环中反复rbind导致的性能损耗(文件/数据量越大,优势越明显)
  • 直接在单个文件的处理环节完成列筛选和文件名添加,逻辑更紧凑
  • fread和read_delim比基础包read.csv更适配复杂编码、特殊分隔符的场景

内容的提问来源于stack exchange,提问作者Robin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 10:24:13