2013-03-20 13 views
5

空の行で区切られた複数の距離行列を持つファイルを作成する必要があります。 出力は次のようになります。distオブジェクトのリストをテーブルに保存するR

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

+0

明確にするには、出力に行名と列名を入れないようにしてください。あなたのリストは名前付きリストですか? – A5C1D2H2I1M1N2O1R2T1

+0

はい、正しい。純粋な値。行/列の順序は、そのIDを決定します – Curlew

答えて

5

sinklapply、およびdputを使用する1つのオプションです。 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を印刷したようになります(つまり、行と列の名前が含まれます)。あなたがそのルートに行くことを決めた場合、いくつかの巧妙な正規表現の仕事は余分な行を簡単に削除することができるはずです。

たとえば、capture.outputという出力のテキストエディタに「geany」を使用すると、次の検索と置換のオプションを使用してテキストファイルをクリーンアップすることができました。 ):

  1. ^\s+.*|^\$.*を検索すると^[0-9]+\s(.*)のための単一のスペース
  2. 検索と交換し、道に\1

と交換してください、私は目を好みます距離行列を逆行列に変換するなどの方法です。

+0

完璧!私はいくつかのパラメータを変更しましたが、それは素晴らしいです! – Curlew

関連する問題