R语言中将DataFrame写入XLSX文件时遇到的问题
解决多个单行DataFrame写入XLSX的问题
看起来你在处理文件时踩了几个新手常见的坑,我帮你梳理下问题并给出修正方案:
你的代码里的核心问题
- 循环没用到遍历的文件:你用
lapply遍历files里的文件,但整个函数里根本没使用参数x——也就是说,你每次循环都在读取同一个固定的txt文件,完全没处理你指定文件夹下的那些xlsx文件(而且这里还有个矛盾:你列出来的files是xlsx格式,但代码里读的是txt,大概率是pattern写错了)。 - 写入的是txt而非XLSX:你最终用
write.table输出的是txt文件,而且因为append=FALSE,每次循环都会覆盖之前的内容,最后只留下最后一次处理的结果。 - 格式处理不到位:转置后的
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
相关产品推荐
相关产品推荐

