簡體   English   中英

R:使用xtabs創建對稱矩陣

[英]R: creating a symmetric matrix with xtabs

我有三種型號:M1,M2和M3。 我成對比較模型並得到分數。 我只做單向比較。 M1和M2相同,但不是M2和M1。 我想將它們轉換為一個symmetrix矩陣。

我能夠使用xtabs將數據集轉換為矩陣,但是它沒有M1-M1和M3-M3距離。

d <- data.frame(M1 = c("M1", "M1", "M1", "M2", "M2", "M3"),
            M2 = c("M2", "M3", "M4", "M3", "M4", "M4"),
            C = c(1, 1, 4, 2, 2, 6))

dm = xtabs(C~M1+M2, data=d)


> d
  M1 M2 C
1 M1 M2 1
2 M1 M3 1
3 M1 M4 4
4 M2 M3 2
5 M2 M4 2
6 M3 M4 6
> dm
    M2
M1   M2 M3 M4
  M1  1  1  4
  M2  0  2  2
  M3  0  0  6

我嘗試將上面的三角形復制到下面的三角形,但由於它不是對稱矩陣,因此無法正常工作。 我想知道如何包括M1-M1和M3-M3距離並使其成為對稱矩陣。 即使距離為0,當我嘗試將矩陣轉換為dist()對象時,也會出現問題嗎?

> dm[lower.tri(dm)] <- t(dm)[lower.tri(dm)]
> dm
    M2
M1   M2 M3 M4
  M1  1  1  4
  M2  1  2  2
  M3  4  2  6

添加其轉置。 那給了對角線兩次,所以減去它。

dm + t(dm) - diag(diag(dm))

贈送:

    M2
M1   M2 M3 M4
  M1  1  1  4
  M2  1  2  2
  M3  4  2  6

如果我們知道所有元素都是非負數,那么這也將起作用:

pmax(dm, t(dm))

為了獲得對稱矩陣,您可能希望在每個維度上設置相同的級別(M1至M4):

一種方法是將變量設置為具有相同因子水平集的因子。

d[c("M1", "M2")] <- lapply(d[c("M1", "M2")], factor, levels=unique(unlist(d[c("M1", "M2")]))) 

然后,您可以像以前一樣使用xtabs ,並將結果添加到結果的轉置中。

dm <- xtabs(C ~ M1 + M2, data=d)

dm + t(dm)

#    M2
#M1   M1 M2 M3 M4
#  M1  0  1  1  4
#  M2  1  0  2  2
#  M3  1  2  0  6
#  M4  4  2  6  0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM