2012-05-22 25 views
6

Với ma trậnLàm cách nào để tạo ma trận khoảng cách có chứa điểm tuyệt đối trung bình giữa mỗi hàng?

 X1 X2 X3 X4 X5 
[1,] 1 2 3 2 1 
[2,] 2 3 4 4 3 
[3,] 3 4 4 6 2 
[4,] 4 5 5 5 4 
[5,] 2 3 3 3 6 
[6,] 5 6 2 8 4 

Tôi muốn tạo ra một ma trận khoảng cách chứa sự khác biệt có ý nghĩa tuyệt đối giữa mỗi hàng mỗi cột. Ví dụ: khoảng cách giữa X1 và X3 phải = 1.67 cho rằng:

abs (1 - 3) + abs (2-4) + abs (3-4) + abs (4-5) + abs (2-3) + abs (5-2) = 10/6 = 1,67.

Tôi đã thử bằng cách sử dụng chức năng designdist trong gói chay theo cách này:

designdist(t(test), method = "abs(A-B)/6", terms = "minimum") 

Khoảng cách kết quả cho cột 1 và 3 là 0,666. Vấn đề với hàm này là nó tổng hợp tất cả các giá trị trong mỗi cột và sau đó trừ chúng. Nhưng tôi cần tổng hợp sự khác biệt tuyệt đối giữa mỗi hàng (riêng lẻ, tuyệt đối) và sau đó chia nó cho N.

Trả lời

5

Đây là giải pháp một dòng. Nó lợi dụng đối số dist() 's method để tính L1 norm aka city block distance aka Manhattan distance giữa mỗi cặp cột trong data.frame của bạn.

as.matrix(dist(df, "manhattan", diag=TRUE, upper=TRUE)/nrow(df)) 

Để làm cho nó tái sản xuất:

df <- read.table(text=" 
X1 X2 X3 X4 X5 
    1 2 3 2 1 
    2 3 4 4 3 
    3 4 4 6 2 
    4 5 5 5 4 
    2 3 3 3 6 
    5 6 2 8 4", header=T) 

dmat <- as.matrix(dist(df, "manhattan", diag=TRUE, upper=TRUE)/nrow(df)) 
print(dmat, digits=3) 
#  1  2  3 4  5 6 
# 1 0.00 1.167 1.667 2.33 1.333 3.00 
# 2 1.17 0.000 0.833 1.17 0.833 2.17 
# 3 1.67 0.833 0.000 1.00 1.667 1.67 
# 4 2.33 1.167 1.000 0.00 1.667 1.33 
# 5 1.33 0.833 1.667 1.67 0.000 2.33 
# 6 3.00 2.167 1.667 1.33 2.333 0.00 
+0

Nó làm việc thật đẹp! Cảm ơn bạn! – Werner

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