Cur*_*lew 5 export r distance matrix
我需要创建一个文件,其中多个距离矩阵用空行分隔.输出应如下所示:
# 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
Run Code Online (Sandbox Code Playgroud)
我在R中的列表中有100个距离矩阵,我需要将它们导出到txt文件,如上例所示.任何人都知道如何做到这一点?我需要一个文件而不是多个txt文件.
下面是使用一个选项sink,lapply和dput.为了write.table在一个dist对象上使用,它需要是一个矩阵,所以在这个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
Run Code Online (Sandbox Code Playgroud)
以下是如何将输出写入文件,其间有一些空行.在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()
Run Code Online (Sandbox Code Playgroud)
打开"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
Run Code Online (Sandbox Code Playgroud)
当然,capture.output(myList, file = "myDistList.txt")也可以让你非常接近你想要的输出 - 但就像你打印myList到屏幕一样(也就是说,它将包括行名和列名).如果您决定走这条路线,一些聪明的正则表达式工作应该能够轻松地删除多余的线条.
例如,使用" geany "作为输出的文本编辑器capture.output,我能够使用以下搜索和替换选项清理文本文件(当然,选择"使用正则表达式"):
^\s+.*|^\$.*并替换为单个空格^[0-9]+\s(.*)并替换为\1在某种程度上,我更喜欢这种方法,必须返回并将距离矩阵转换为矩阵,依此类推.