Pertanyaan Menyimpan daftar objek dist ke tabel di R


saya perlu membuat file dengan matriks jarak jauh yang dipisahkan dengan garis kosong. Outputnya akan terlihat seperti ini:

# 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

Saya punya seperti 100 matriks jarak dalam daftar di R dan saya perlu mengekspornya ke file txt seperti yang ditunjukkan pada contoh di atas. Adakah yang punya ide bagaimana melakukan ini? Saya membutuhkan satu file dan tidak banyak txt-file.


5
2018-03-20 10:30


asal


Jawaban:


Ini satu opsi yang digunakan sink, lapply, dan dput. Untuk digunakan write.table pada suatu dist objek, itu perlu matriks, jadi di lapply langkah, kita mengubahnya menjadi matriks, kemudian secara manual mengatur segitiga diagonal dan atas NA sebelum menulis output kami.

Berikut ini beberapa contoh data:

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

Inilah bagaimana Anda dapat menulis output ke file dengan beberapa baris kosong di antaranya. Ada juga garis NULL setelah setiap matriks telah dicetak yang dapat dengan mudah dihapus.

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()

Membuka "myDistList.txt" seharusnya memberi Anda sesuatu yang terlihat seperti ini:

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

Tentu saja, capture.output(myList, file = "myDistList.txt") juga akan membuatmu sangat dekat dengan output yang Anda inginkan - tetapi itu akan sama seperti jika Anda mencetak myList untuk menyaring (artinya, akan menyertakan nama baris dan kolom). Beberapa pekerjaan regex yang cerdas harus dapat menghapus garis ekstra dengan mudah, jika Anda memutuskan untuk pergi ke rute tersebut.

Misalnya, menggunakan "geany"sebagai editor teks saya untuk output capture.output, Saya dapat membersihkan file teks dengan opsi pencarian-dan-ganti berikut (dengan "Gunakan kalimat biasa" dipilih, tentu saja):

  1. Pencarian untuk ^\s+.*|^\$.* dan ganti dengan satu spasi
  2. Pencarian untuk ^[0-9]+\s(.*) dan ganti dengan \1

Di satu sisi, saya lebih memilih metode ini untuk harus kembali melalui dan mengkonversi matriks jarak ke matriks dan sebagainya.


5
2018-03-20 11:11