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):
- Szukaj
^\s+.*|^\$.*
i zastąpić pojedynczym odstępem
- 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.
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
tak, poprawne. Czyste wartości. Kolejność wierszy/kolumn określa ich tożsamość: – Curlew