首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从r中矩阵的下三角中获取元素序信息

如何从r中矩阵的下三角中获取元素序信息
EN

Stack Overflow用户
提问于 2020-09-02 21:43:45
回答 2查看 113关注 0票数 0

我有一个5x5协方差矩阵如下:

代码语言:javascript
运行
复制
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"

然后,我得到了下面的三角形:

代码语言:javascript
运行
复制
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"

我需要生成一个字符变量,包括如下所示的分组变量。

代码语言:javascript
运行
复制
group <- c(1,2,3,4)

期望输出

代码语言:javascript
运行
复制
"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对象中的0。第三个元素的( 0.
  2. So )序号应该是2,因为顺序以Covariance[#].

开头,对角线元素的序号为2,5,9,14,需要在Covariance[#].中

任何帮助都是非常感谢的。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-03 03:44:56

将上三角矩阵设置为NA,得到'Free'值在m中的索引,忽略NA值。使用该索引生成要使用paste0sprintf的文本。

代码语言:javascript
运行
复制
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])"
票数 1
EN

Stack Overflow用户

发布于 2020-09-02 23:44:47

上面的数据语句生成了一个6x6矩阵,所以我将其编辑为5x5,以复制上面的内容。然后,通过使用上三角形,实际上更容易找到自由元素的序号。

代码语言:javascript
运行
复制
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

由于您不需要第一个元素,所以我们可以执行以下操作:

代码语言:javascript
运行
复制
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的上三角形,但将输出的第一列切断。接下来,只需找出哪些观测是"Free",而这些是我们称之为inds的序号。

代码语言:javascript
运行
复制
inds <- which(ut == "Free")

然后,我们可以定义group变量。我们还可以定义每个字符串的两部分--组和协方差语句。

代码语言:javascript
运行
复制
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变量拆分数据框架,这样所有相同的协方差组都在一起。

代码语言:javascript
运行
复制
eg <- split(eg, eg$cov)

eg现在是一个有四个组的列表,每个协方差组一个。

现在,通过一堆粘贴语句,我们可以把所有的部分放在一起。

代码语言:javascript
运行
复制
## 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]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63713925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档