2013-03-20 32 views
5

tôi cần tạo một tệp có nhiều ma trận khoảng cách được phân cách bằng một dòng trống. Đầu ra nên trông như thế này:Lưu danh sách các đối tượng địa lý vào bảng trong 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 

Tôi có như 100 ma trận khoảng cách trong một danh sách trong R và tôi cần phải xuất khẩu chúng sang một txt file như trong ví dụ trên. Bất cứ ai cũng có một ý tưởng làm thế nào để làm điều này? Tôi cần một tệp duy nhất và không phải nhiều tệp txt.

+0

Để 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

+0

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

Trả lời

5

Dưới đây là một tùy chọn sử dụng sink, lapplydput. Để 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):

  1. Tìm kiếm ^\s+.*|^\$.* và thay thế bằng một không gian đơn
  2. 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.

+0

hoàn hảo! Tôi đã thay đổi một số thông số, nhưng nó hoạt động tuyệt vời! – Curlew

Các vấn đề liên quan