R语言保存循环迭代结果至带空行间隔CSV时write.list报错求解
问题背景
开展100次迭代的分析工作时,for循环每次运行分析流程得到结果后,将pvalue<0.1的筛选结果以b[[i]]的列表格式存储,需要将b[[1]]到b[[100]]的所有结果存入同一个CSV表格,要求:
- 固定列字段为
name、size、pvalue - 不同迭代的结果块之间保留空行间隔
- 兼容部分迭代无符合条件结果(即空数据框)的情况
使用write.list函数导出时触发报错。
目标格式示例
| name | size | pvalue |
|---|---|---|
| a.1 | 5 | 0.01 |
| b.1 | 2 | 0.005 |
| c.2 | 2 | 0.005 |
注:前2行对应b[[1]]结果,空行后第4行起为b[[2]]结果
原有实现代码
b=list() for(i in 1:100) { # Run analysis Result=SAMGS(GS=GS,DATA=ndata,cl=ncl,nbPermutations=1000) r=data.frame() r=subset(Result, pvalue < 0.1) b[[i]]=r } write.list(b,file="Res.csv", row.names =TRUE)
报错信息
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 1, 0
报错原因
调用的write.list为第三方包函数,处理列表中存在的0行空数据框时,会尝试合并不等长向量生成数据框,触发行数不匹配错误;同时该函数本身不支持自定义在不同列表元素的输出内容之间插入空行,无法满足格式要求。
解决方案
直接使用R基础写入函数逐次追加内容,无需依赖第三方包,可同时兼容空结果、块间空行、固定列的要求,替换原有导出部分的代码即可:
# 首次写入文件,输出固定表头,不使用追加模式 write.csv( data.frame(name = character(), size = integer(), pvalue = numeric()), file = "Res.csv", row.names = FALSE, quote = FALSE ) # 遍历所有迭代结果逐块追加写入 for (i in seq_along(b)) { current_result <- b[[i]] # 非首个结果块写入前,先插入空行做分隔 if (i > 1) { cat("\n", file = "Res.csv", append = TRUE) } # 当前迭代存在有效结果时,写入对应内容,不重复输出表头、不输出行名 if (nrow(current_result) > 0) { write.table( current_result, file = "Res.csv", sep = ",", append = TRUE, row.names = FALSE, col.names = FALSE, quote = FALSE ) } }
代码说明
- 首次写入仅输出一次表头,后续追加写入时关闭列名输出,避免CSV中重复出现表头
- 所有非首个结果块写入前自动插入空行,无论当前迭代是否存在有效结果,块间分隔都符合要求
- 自动跳过0行空结果的内容写入,不会触发格式错误
- 输出为标准逗号分隔CSV格式,可直接用Excel、文本编辑器打开读取
内容的提问来源于stack exchange,提问作者Sarahk
相关产品推荐
相关产品推荐

