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

R语言中将DataFrame写入XLSX文件时遇到的问题

解决多个单行DataFrame写入XLSX的问题

看起来你在处理文件时踩了几个新手常见的坑,我帮你梳理下问题并给出修正方案:

你的代码里的核心问题

  1. 循环没用到遍历的文件:你用lapply遍历files里的文件,但整个函数里根本没使用参数x——也就是说,你每次循环都在读取同一个固定的txt文件,完全没处理你指定文件夹下的那些xlsx文件(而且这里还有个矛盾:你列出来的files是xlsx格式,但代码里读的是txt,大概率是pattern写错了)。
  2. 写入的是txt而非XLSX:你最终用write.table输出的是txt文件,而且因为append=FALSE,每次循环都会覆盖之前的内容,最后只留下最后一次处理的结果。
  3. 格式处理不到位:转置后的tp是矩阵,直接写入时容易出现格式问题,需要转为DataFrame再处理。

修正后的解决方案

我会分两种场景给你代码:一种是把所有单行数据合并到XLSX的同一个工作表(每行对应一个文件的结果),另一种是每个文件的单行数据放在单独的工作表里。

首先,我们需要用专门处理XLSX的包,推荐openxlsx(轻量且不需要Java依赖)。

场景1:所有单行合并到同一个工作表

# 安装并加载openxlsx包(如果没装过的话)
if (!require(openxlsx)) {
  install.packages("openxlsx")
  library(openxlsx)
}

# 修正文件路径和匹配规则:如果你要处理的是txt文件,把pattern改成"*.txt"
# 如果你确实要处理xlsx文件,后面的read.table要换成read.xlsx
files <- list.files(path="C:/Users/owner/Desktop/LONG_TABLE_DATA", 
                    pattern="*.txt",  # 这里根据实际文件格式调整
                    full.names=T, 
                    recursive=FALSE)

# 创建空列表存储每个文件的单行结果
all_single_rows <- list()

# 遍历每个文件处理
for (file_idx in seq_along(files)) {
  # 读取当前文件,只提取第10列(用rep简化colClasses的写法)
  raw_data <- read.table(files[file_idx], 
                         sep = "\t", 
                         dec = ".", 
                         stringsAsFactors = FALSE, 
                         colClasses = c(rep("NULL", 9), "numeric", rep("NULL", 5)))
  
  # 转置成单行并转为DataFrame
  single_row_df <- as.data.frame(t(raw_data))
  
  # 把结果加入列表
  all_single_rows[[file_idx]] <- single_row_df
}

# 把所有单行合并成一个大DataFrame
combined_result <- do.call(rbind, all_single_rows)

# 写入XLSX文件
write.xlsx(combined_result, file = "merged_result.xlsx", rowNames = FALSE, colNames = FALSE)

场景2:每个文件的单行放在单独工作表

# 同样先加载openxlsx
if (!require(openxlsx)) {
  install.packages("openxlsx")
  library(openxlsx)
}

files <- list.files(path="C:/Users/owner/Desktop/LONG_TABLE_DATA", 
                    pattern="*.txt", 
                    full.names=T, 
                    recursive=FALSE)

# 创建一个新的工作簿对象
wb <- createWorkbook()

# 遍历每个文件,写入单独工作表
for (file_idx in seq_along(files)) {
  raw_data <- read.table(files[file_idx], 
                         sep = "\t", 
                         dec = ".", 
                         stringsAsFactors = FALSE, 
                         colClasses = c(rep("NULL", 9), "numeric", rep("NULL", 5)))
  
  single_row_df <- as.data.frame(t(raw_data))
  
  # 用文件名作为工作表名称(去掉后缀更整洁)
  sheet_name <- tools::file_path_sans_ext(basename(files[file_idx]))
  addWorksheet(wb, sheetName = sheet_name)
  
  # 把数据写入对应工作表
  writeData(wb, sheet = sheet_name, x = single_row_df, rowNames = FALSE, colNames = FALSE)
}

# 保存工作簿
saveWorkbook(wb, file = "separate_sheets_result.xlsx", overwrite = TRUE)

额外提示

  • 如果你的files确实是xlsx格式,把read.table换成read.xlsx(openxlsx包里的函数),同时调整colClasses的写法适配xlsx读取。
  • 用for循环比lapply更直观,新手更容易调试,等熟悉后再用lapply简化代码也没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:47:29