簡體   English   中英

r中如何從矩陣的下三角獲取元素順序信息

[英]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[#]中的數字是矩陣下三角中對角線元素的順序。

  1. 第一個( Free )元素的順序在lower.triangle object 中為0我在所需的 output 中不需要它。
  2. 第三個元素的 ( Free ) 訂單號應該是 2,因為訂單是從0開始的。
  3. 因此,對角線元素的順序號為 2,5,9,14,需要位於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值。 使用該索引通過paste0sprintf生成您想要的文本。

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.

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