[英]How to get element order information from a lower triangle of a matrix in r
我有一個 5x5 協方差矩陣如下:
unique.items <- c(1,2,3,4)
diag <- rep("Free",length(unique.items)+1)
offdiag <- rep("0.0", (length(unique.items)+1)*length(unique.items)/2 )
m <- matrix(NA, ncol = length(diag), nrow = length(diag))
m[lower.tri(m)] <- offdiag
m[upper.tri(m)] <- t(m)[upper.tri(t(m))]
diag(m) <- diag
> m
[,1] [,2] [,3] [,4] [,5]
[1,] "Free" "0.0" "0.0" "0.0" "0.0"
[2,] "0.0" "Free" "0.0" "0.0" "0.0"
[3,] "0.0" "0.0" "Free" "0.0" "0.0"
[4,] "0.0" "0.0" "0.0" "Free" "0.0"
[5,] "0.0" "0.0" "0.0" "0.0" "Free"
然后,我通過以下方式得到下三角:
lower.triangle <- paste(tapply(m[lower.tri(m, diag = TRUE)],
row(m)[lower.tri(m, diag = TRUE)], FUN = toString),
collapse=",")
> lower.triangle
"Free,
0.0, Free,
0.0, 0.0, Free,
0.0, 0.0, 0.0, Free,
0.0, 0.0, 0.0, 0.0, Free"
我需要生成一個包含分組變量的字符變量,如下所示。
group <- c(1,2,3,4)
需要 output
"Equal = (G4, Covariance[2]), (G1, Covariance[2]), (G2, Covariance[2]), (G3, Covariance[2]);
Equal = (G4, Covariance[5]), (G1, Covariance[5]), (G2, Covariance[5]), (G3, Covariance[5]);
Equal = (G4, Covariance[9]), (G1, Covariance[9]), (G2, Covariance[9]), (G3, Covariance[9]);
Equal = (G4, Covariance[14]), (G1, Covariance[14]), (G2, Covariance[14]), (G3, Covariance[14]);"
G1、G2、G3 和 G4 用於分組。 Covariance[#]
中的數字是矩陣下三角中對角線元素的順序。
Free
)元素的順序在lower.triangle
object 中為0
我在所需的 output 中不需要它。Free
) 訂單號應該是 2,因為訂單是從0
開始的。Covariance[#]
中。任何幫助表示贊賞。 謝謝!
上面的數據語句構成了一個 6x6 矩陣,因此我將其編輯為 5x5,以復制上面的內容。 然后,通過使用上三角,實際上更容易找到空閑元素的序號。
unique.items <- c(1,2,3,4,5)
diag <- rep("Free",length(unique.items))
offdiag <- rep("0.0", (length(unique.items)-1)*length(unique.items)/2 )
m <- matrix(NA, ncol = length(diag), nrow = length(diag))
m[lower.tri(m)] <- offdiag
m[upper.tri(m)] <- t(m)[upper.tri(t(m))]
diag(m) <- diag
由於您不想要第一個元素,我們可以執行以下操作:
ut <- m[,-1][upper.tri(m, diag=TRUE)[,-1]]
ut
# [1] "0.0" "Free" "0.0" "0.0" "Free" "0.0" "0.0" "0.0" "Free" "0.0" "0.0" "0.0"
# [13] "0.0" "Free"
這會從m
中刪除第一列,然后找到m
的上三角形,但會刪除 output 的第一列。 接下來,只需找到哪些觀察結果是"Free"
的,這些就是我們稱為inds
的訂單號。
inds <- which(ut == "Free")
然后我們可以定義group
變量。 我們還可以定義每個字符串的兩部分——組和協方差語句。
group <- c(1,2,3,4)
eg <- expand.grid(group = paste0("G", group), cov=paste0(" Covariance[", inds, "]"))
head(eg)
# group cov
# 1 G1 Covariance[2]
# 2 G2 Covariance[2]
# 3 G3 Covariance[2]
# 4 G4 Covariance[2]
# 5 G1 Covariance[5]
# 6 G2 Covariance[5]
接下來,我們根據cov
變量拆分數據框,以便所有相同的協方差組都在一起。
eg <- split(eg, eg$cov)
eg
現在是一個包含四個組的列表,每個協方差組一個。
現在,有了一堆粘貼語句,我們就可以把所有的部分放在一起了。
## collapses all of the pasted statements together by a new-line character \n
out <- paste(
## does the paste functions to each element of the list
sapply(eg, function(x)
## puts Equal = and ; around the result below
paste0("Equal = ",
## pastes the (G#, covariance[#]) together and collapses by a ,
paste(
## makes (G#, covariance[#])
paste0("(", x$group, ",", x$cov, ")"),
collapse=", "),
";")
),
collapse="\n")
cat(out)
# Equal = (G1, Covariance[2]), (G2, Covariance[2]), (G3, Covariance[2]), (G4, Covariance[2]);
# Equal = (G1, Covariance[5]), (G2, Covariance[5]), (G3, Covariance[5]), (G4, Covariance[5]);
# Equal = (G1, Covariance[9]), (G2, Covariance[9]), (G3, Covariance[9]), (G4, Covariance[9]);
# Equal = (G1, Covariance[14]), (G2, Covariance[14]), (G3, Covariance[14]), (G4, Covariance[14]);
將上三角矩陣設置為NA
並在m
中獲取'Free'
值的索引,省略NA
值。 使用該索引通過paste0
和sprintf
生成您想要的文本。
group <- c(4,1:3)
m[upper.tri(m)] <- NA
inds <- which(na.omit(c(t(m))) == 'Free')[-1] - 1
#first -1 because you want to ignore first 'Free' and
#second -1 because indexing start from 0 in your case.
inds
#[1] 2 5 9 14
sapply(inds, function(x)paste0('Equal = ',
paste0(sprintf('(G%d, Covariance[%d])', group, x), collapse = " , ")))
#[1] "Equal = (G4, Covariance[2]) , (G1, Covariance[2]) , (G2, Covariance[2]) , (G3, Covariance[2])"
#[2] "Equal = (G4, Covariance[5]) , (G1, Covariance[5]) , (G2, Covariance[5]) , (G3, Covariance[5])"
#[3] "Equal = (G4, Covariance[9]) , (G1, Covariance[9]) , (G2, Covariance[9]) , (G3, Covariance[9])"
#[4] "Equal = (G4, Covariance[14]) , (G1, Covariance[14]) , (G2, Covariance[14]) , (G3, Covariance[14])"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.