R语言write.table追加列表元素列名不匹配报错的解决方法
问题描述
我有一个由不同变量表组成的列表,可复现的示例代码如下(注:原代码中iris[,i]需修正为iris[,ii]才能正常运行):
results <- list() for(ii in names(iris)[1:4]) { mytab <- table(iris[,ii] > mean(iris[,ii]), iris$Species) myp <- chisq.test(mytab)$p.value results[[ii]] <- as.data.frame(cbind(mytab, P.value=myp)) results[[ii]] <- tibble::rownames_to_column(results[[ii]], ii) }
在旧版R(至少4.0版本)中,我曾用以下代码将所有表追加写入myfile.txt:
lapply(results, function(x) write.table(x, "myfile.txt", append=T, sep="\t", quote=F, row.names=F))
该代码在2021年底前可正常运行,但现在报错:
Error in write.table(x, "myfile.txt", append = T, sep = "\t", quote = T, : (converted from warning) appending column names to file
我知道报错原因是追加的表列名不匹配,但只需要输出所有表内容。想问有没有办法强制忽略列名不匹配进行追加?试过col.names=NA,但收到“row.names=F时使用col.names=NA无意义”的错误。是否必须用sink这类函数?希望输出保持制表符分隔格式。
解决方案
无需使用sink,可以通过控制列名的输出时机来解决问题,以下是两种可行方法:
方法一:仅首次写入时输出列名
如果需要保留第一个表的列名,后续表只输出内容不重复列名,可以用循环控制col.names参数,仅在第一次写入时设为TRUE:
# 先创建/清空目标文件(若需覆盖旧文件) file.create("myfile.txt") # 循环写入列表中的每个表 for (idx in seq_along(results)) { write.table(results[[idx]], file = "myfile.txt", append = TRUE, sep = "\t", quote = FALSE, row.names = FALSE, col.names = idx == 1) # 仅首次写入输出列名 }
方法二:完全不输出列名
如果不需要任何列名,直接输出所有表的内容,只需在write.table中设置col.names = FALSE即可:
file.create("myfile.txt") lapply(results, function(x) { write.table(x, "myfile.txt", append = TRUE, sep = "\t", quote = FALSE, row.names = FALSE, col.names = FALSE) })
这两种方法都能避免因列名不匹配导致的报错,同时保持制表符分隔的输出格式。
内容的提问来源于stack exchange,提问作者ktmbiome
相关产品推荐
相关产品推荐

