Dưới đây là một tùy chọn sử dụng sink
, lapply
và dput
. Để sử dụng write.table
trên đối tượng dist
, nó cần phải là ma trận, do đó, trong bước lapply
, chúng tôi chuyển đổi thành ma trận, sau đó đặt tam giác và tam giác trên theo cách thủ công thành NA
trước khi viết đầu ra của chúng tôi.
Dưới đây là một số dữ liệu mẫu:
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
Đây là cách bạn có thể viết ra vào một tập tin với một số dòng trống ở giữa. Ngoài ra còn có một dòng NULL
sau mỗi ma trận đã được in mà có thể dễ dàng được loại bỏ.
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()
Mở cửa "myDistList.txt" sẽ cho bạn cái gì đó trông như thế này:
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
Tất nhiên, capture.output(myList, file = "myDistList.txt")
cũng sẽ giúp bạn có rất gần mong muốn của bạn output- Nhưng nó sẽ giống như khi bạn in myList
vào màn hình (nghĩa là nó sẽ bao gồm tên hàng và cột). Một số công việc regex thông minh sẽ có thể loại bỏ các dòng phụ dễ dàng mặc dù, nếu bạn quyết định đi con đường đó. Ví dụ: sử dụng "geany" làm trình soạn thảo văn bản của tôi cho kết quả của capture.output
, tôi có thể xóa tệp văn bản bằng các tùy chọn tìm kiếm và thay thế sau (với "Sử dụng cụm từ thông dụng" được chọn, tất nhiên):
- Tìm kiếm
^\s+.*|^\$.*
và thay thế bằng một không gian đơn
- Tìm kiếm
^[0-9]+\s(.*)
và thay thế bằng \1
Trong một cách, tôi thích thứ là phương pháp phải quay lại và chuyển đổi ma trận khoảng cách thành ma trận và vân vân.
Để làm rõ: bạn không muốn tên hàng và tên cột trong đầu ra, đúng không? Và danh sách của bạn có phải là danh sách được đặt tên không? – A5C1D2H2I1M1N2O1R2T1
vâng, đúng. Giá trị thuần túy. Thứ tự của các hàng/cột xác định danh tính của chúng – Curlew