2013-03-20 13 views
5

Potrzebuję utworzyć plik z wieloma macierzami odległości oddzielonymi pustym wierszem. Wyjście powinno wyglądać tak:Zapisz listę obiektów dist do tabeli w 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 

mam jak 100 matrycami odległości w liście w badania i trzeba je wyeksportować do pliku tekstowego, jak pokazano w powyższym przykładzie. Ktoś ma pomysł, jak to zrobić? Potrzebuję jednego pliku, a nie wielu plików txt.

+0

Aby wyjaśnić: nie chcesz, aby nazwy wierszy i nazwy kolumn były na wyjściu, prawda? A czy twoja lista jest nazwaną listą? – A5C1D2H2I1M1N2O1R2T1

+0

tak, poprawne. Czyste wartości. Kolejność wierszy/kolumn określa ich tożsamość: – Curlew

Odpowiedz

5

Oto jedna z opcji: sink, lapply i dput. Aby użyć obiektu write.table na obiekcie dist, musi to być macierz, więc w kroku lapply przekształcamy go w macierz, a następnie ręcznie ustawiamy ukośny i górny trójkąt na NA przed zapisaniem naszego wyjścia.

Oto przykładowe dane:

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 

Oto jak można napisać wyjście do pliku z niektórych pustych linii pomiędzy. Istnieje również linia NULL po wydrukowaniu każdej matrycy, którą można łatwo usunąć.

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

Otwarcie "myDistList.txt" powinny dać ci coś, co wygląda tak:

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 

Oczywiście capture.output(myList, file = "myDistList.txt") również ci bardzo blisko żądanego output- - ale byłoby tak, jakbyś wydrukował ekran myList (to znaczy, że będzie zawierał nazwy wierszy i kolumn). Pewna sprytna praca z wyrażeniem regularnym powinna być w stanie łatwo usunąć dodatkowe linie, jeśli zdecydujesz się na tę trasę.

Na przykład za pomocą „geany” jako mojego edytora tekstu na wyjściu capture.output, udało mi się oczyścić plik tekstowy z następującymi wyszukiwania i zamiany opcji (z „używać wyrażeń regularnych” wybrany, oczywiście):

  1. Szukaj ^\s+.*|^\$.* i zastąpić pojedynczym odstępem
  2. Szukaj ^[0-9]+\s(.*) i zastąpić \1

W pewnym sensie wolę th jest metodą, aby wrócić i przekształcić matrycę odległości w matrycę i tak dalej.

+0

perfect! Zmieniłem niektóre parametry, ale działa świetnie! – Curlew