5

空の行で区切られた複数の距離行列を含むファイルを作成する必要があります。出力は次のようになります。

# 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ファイルではなく、単一のファイルが必要です。

4

1 に答える 1

5

sink、、、lapplyおよびを使用する1つのオプションがあり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

空白行を挟んで出力をファイルに書き込む方法は次のとおりです。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

たとえば、の出力用のテキストエディタとして「 geanycapture.output 」を使用すると、次の検索と置換のオプションを使用してテキストファイルをクリーンアップできました(もちろん、「正規表現を使用」が選択されています)。

  1. 検索^\s+.*|^\$.*して単一のスペースに置き換えます
  2. 検索し^[0-9]+\s(.*)て置き換えます\1

ある意味で、距離行列を元に戻して行列に変換するよりも、この方法の方が好きです。

于 2013-03-20T11:11:16.477 に答える