在write.table中添加列表元素



我有一个列表,基本上是不同变量的表,下面是一个可重复的虚拟示例(它有点难看,但它能传达思想)。

results <- list()
for(ii in names(iris)[1:4]) {
mytab <- table(iris[,i] > mean(iris[,i]), 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)中,我曾经能够做这样的事情:

lapply(results, function(x) write.table(x, "myfile.txt", append=T, sep="t", quote=F, row.names=F))

将生成一个名为myfile.txt的文件,并在其中填充我的所有表,就像从结果中打印的表列表一样。至少从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,但随后收到使用col.names=NA与row.names=F"没有意义"的错误。我是否需要放弃使用sink这样的函数?如果可能的话,我真的希望所有的东西都保持tab分隔。

它似乎是内置的,完全取决于col.namesappend参数,并且没有简单的方法来压制它那里

一般来说,这只是一个警告,但由于它被提升到Error状态,这表明您已经设置了options(warn = 2)或更高。它不是这些分辨率的一个因素(这导致不会发出警告,因此不会升级为错误)。

  1. 抑制它和所有其他警告(无论是好是坏):

    write.table(data.frame(a=1,b=2), "quux.csv", append=T, sep="t", quote=F, row.names=F)
    # Error in write.table(data.frame(a = 1, b = 2), "quux.csv", append = T,  : 
    #   (converted from warning) appending column names to file
    suppressWarnings(write.table(data.frame(a=1,b=2), "quux.csv", append=T, sep="t", quote=F, row.names=F))
    ### nothing emitted, file appended
    
  2. 只抑制警告,允许其他(因为抑制所有可以隐藏其他问题):

    withCallingHandlers(
    write.table(data.frame(a=1,b=2), "quux.csv", append=T, sep="t", quote=F, row.names=F),
    warning = function(w) {
    if (grepl("appending column names to file", conditionMessage(w))) { 
    invokeRestart("muffleWarning")
    }
    })
    ### nothing emitted, file appended
    withCallingHandlers(
    write.table(data.frame(a=1,b=2), "quux.csv", append=T, sep="t", quote=F, row.names=F),
    warning = function(w) {
    if (grepl("something else", conditionMessage(w))) { 
    invokeRestart("muffleWarning")
    }
    })
    # Error in write.table(data.frame(a = 1, b = 2), "quux.csv", append = T,  : 
    #   (converted from warning) appending column names to file
    

另一个可能的解决方案是使用erer包中的write.list():

library(erer)
#> Loading required package: lmtest
#> Loading required package: zoo
#> 
#> Attaching package: 'zoo'
#> The following objects are masked from 'package:base':
#> 
#>     as.Date, as.Date.numeric
#> Registered S3 method overwritten by 'quantmod':
#>   method            from
#>   as.zoo.data.frame zoo
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)
}
write.list(z = results, file = "myfile.txt", row.names = FALSE, quote = FALSE)
read.csv("~/Desktop/myfile.txt")
#>          Result Sepal.Length setosa versicolor virginica      P.value
#> 1  Sepal.Length        FALSE     50         24         6 8.373761e-18
#> 2  Sepal.Length         TRUE      0         26        44 8.373761e-18
#> 3                                                                    
#> 4        Result  Sepal.Width setosa versicolor virginica      P.value
#> 5   Sepal.Width        FALSE      8         42        33  1.24116e-11
#> 6   Sepal.Width         TRUE     42          8        17  1.24116e-11
#> 7                                                                    
#> 8        Result Petal.Length setosa versicolor virginica      P.value
#> 9  Petal.Length        FALSE     50          7         0 9.471374e-28
#> 10 Petal.Length         TRUE      0         43        50 9.471374e-28
#> 11                                                                   
#> 12       Result  Petal.Width setosa versicolor virginica      P.value
#> 13  Petal.Width        FALSE     50         10         0 4.636126e-26
#> 14  Petal.Width         TRUE      0         40        50 4.636126e-26
#> 15
# You can also specify the table names, e.g.
write.list(z = results, file = "myfile2.txt", row.names = FALSE, quote = FALSE, t.name = 1:4)
read.csv("~/Desktop/myfile2.txt")
#>    Result Sepal.Length setosa versicolor virginica      P.value
#> 1       1        FALSE     50         24         6 8.373761e-18
#> 2       1         TRUE      0         26        44 8.373761e-18
#> 3                                                              
#> 4  Result  Sepal.Width setosa versicolor virginica      P.value
#> 5       2        FALSE      8         42        33  1.24116e-11
#> 6       2         TRUE     42          8        17  1.24116e-11
#> 7                                                              
#> 8  Result Petal.Length setosa versicolor virginica      P.value
#> 9       3        FALSE     50          7         0 9.471374e-28
#> 10      3         TRUE      0         43        50 9.471374e-28
#> 11                                                             
#> 12 Result  Petal.Width setosa versicolor virginica      P.value
#> 13      4        FALSE     50         10         0 4.636126e-26
#> 14      4         TRUE      0         40        50 4.636126e-26
#> 15

由reprex包(v2.0.1)创建于2022-07-19

相关内容

  • 没有找到相关文章

最新更新