【问题标题】:Save a list of dist objects to table in R将 dist 对象列表保存到 R 中的表
【发布时间】:2013-03-20 10:30:59
【问题描述】:

我需要创建一个包含多个距离矩阵并用空行分隔的文件。 输出应如下所示:

# First matrix
0.05194497                                                       
0.04652118 0.12935323                                            
0.04269506 0.09953116 0.08464824                                 
         NA         NA         NA         NA                      
0.02884847 0.07769535 0.05385956 0.04588298         NA           
0.03821721 0.12084543 0.13431270 0.06928795         NA 0.05123967
# Empty line

# Second matrix
0.05194497                                                       
0.04652118 0.12935323                                            
0.04269506 0.09953116 0.08464824                                 
        NA         NA         NA         NA                      
0.02884847 0.07769535 0.05385956 0.04588298         NA           
0.03821721 0.12084543 0.13431270 0.06928795         NA 0.05123967

我在 R 的列表中有 100 个距离矩阵,我需要将它们导出到 txt 文件,如上例所示。任何人都知道如何做到这一点?我需要一个文件而不是多个 txt 文件。

【问题讨论】:

  • 澄清一下:您不希望在输出中出现行名和列名,对吗?您的列表是命名列表吗?
  • 是的,正确的。纯粹的价值观。行/列的顺序决定了它们的身份

标签: r matrix export distance


【解决方案1】:

这是一个使用sinklapplydput 的选项。为了在dist对象上使用write.table,它需要是一个矩阵,所以在lapply这一步,我们将它转​​换为一个矩阵,然后在写之前手动设置对角线和上三角为NA我们的输出。

这是一些示例数据:

set.seed(1)
x <- matrix(rnorm(100), nrow = 5)
y <- matrix(rnorm(100), nrow = 5)
myList <- list(A = dist(x),
               B = dist(y))
myList
# $A
#          1        2        3        4
# 2 5.701817                           
# 3 6.013119 5.032069                  
# 4 7.276905 5.325473 5.811861         
# 5 6.619295 5.306750 4.945987 6.612081
# 
# $B
#          1        2        3        4
# 2 7.469565                           
# 3 5.717330 6.407709                  
# 4 5.371346 6.106838 5.057519         
# 5 6.029762 6.256703 4.685266 5.452838

以下是如何将输出写入文件,中间有一些空行。在每个矩阵打印后还有一行NULL 可以轻松删除。

sink("myDistList.txt", type="output")
invisible(
  lapply(myList, function(x) { 
    y <- as.matrix(x)
    y[upper.tri(y)] <- NA
    diag(y) <- NA
    dput(write.table(y, row.names = FALSE,
                     col.names = FALSE, na = ""))
  cat("\n\n")
  }))
sink()

打开“myDistList.txt”应该会得到如下所示的内容:

5.70181650842794    
6.01311946994002 5.03206860827638   
7.27690516432265 5.32547302778382 5.8118611864786  
6.61929500038789 5.3067497799772 4.94598733972826 6.61208111472781 
NULL



7.46956498920544    
5.7173301814994 6.40770896281359   
5.37134559156135 6.10683846835378 5.05751911328028  
6.02976206855185 6.25670324709768 4.68526645722475 5.45283785882534 
NULL

当然,capture.output(myList, file = "myDistList.txt") 也会让你非常接近你想要的输出——但这就像你将myList 打印到屏幕上一样(也就是说,它将包括行和列名)。不过,如果您决定走这条路,一些巧妙的正则表达式工作应该能够轻松删除多余的行。

例如,使用“geany”作为capture.output 输出的文本编辑器,我可以使用以下搜索和替换选项清理文本文件(选中“使用正则表达式” ,当然):

  1. 搜索 ^\s+.*|^\$.* 并替换为单个空格
  2. 搜索^[0-9]+\s(.*) 并替换为\1

在某种程度上,我更喜欢这种方法,而不是必须返回并将距离矩阵转换为矩阵等等。

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2019-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2020-03-17
    • 2013-01-20
    相关资源
    最近更新 更多