将R中的矩阵展平为四列(索引和上/下三角形)

将R中的矩阵展平为四列(索引和上/下三角形),r,matrix,R,Matrix,我正在使用邮件列表中多次发布的cor.prob()函数来获得相关矩阵(下对角线)和p值(上对角线): 我已经看到了,但只会给我一个3列矩阵,而不是一个4列矩阵,其中p值和相关性有单独的列 感谢您的帮助 它不是一个矩阵,因为你不能混合字符和数字。但是: 这是我第一次尝试(在标签交换之前): mcd我只是为了清晰起见才编辑的。我想将cor.prob()的输出压缩成一个四列表,其中两列用于索引,一列用于相关性(位于原始矩阵的下对角线),一列用于p值(位于原始矩阵的上半部分)。是的,做得很好。除了cor

我正在使用邮件列表中多次发布的cor.prob()函数来获得相关矩阵(下对角线)和p值(上对角线):

我已经看到了,但只会给我一个3列矩阵,而不是一个4列矩阵,其中p值和相关性有单独的列


感谢您的帮助

它不是一个矩阵,因为你不能混合字符和数字。但是:

这是我第一次尝试(在标签交换之前):


m
cd我只是为了清晰起见才编辑的。我想将cor.prob()的输出压缩成一个四列表,其中两列用于索引,一列用于相关性(位于原始矩阵的下对角线),一列用于p值(位于原始矩阵的上半部分)。是的,做得很好。除了cor/p中的开关ut/lt(相关性较低,p为上三角形)。我会编辑。@StephenTurner,请预览ChrisW的评论:“最后一行应该是
p=t(m)[ut]
,否则它不会泛化为>3行/列。”。他显然无法发表评论。如果没有编辑,它似乎工作得很好。我会用新的答案回答。必须是新的答案-太长,无法评论。是的,我在将其应用于mtcars数据时遇到问题。什么样的问题?见上面编辑的回复,太大了,无法评论。
cor.prob <- function (X, dfr = nrow(X) - 2) {
  R <- cor(X)
  above <- row(R) < col(R)
  r2 <- R[above]^2
  Fstat <- r2 * dfr/(1 - r2)
  R[above] <- 1 - pf(Fstat, 1, dfr)
  R[row(R) == col(R)] <- NA
  R
}

d <- data.frame(x=1:5, y=c(10,16,8,60,80), z=c(10,9,12,2,1))

cor.prob(d)

> cor.prob(d)
           x           y           z
x         NA  0.04856042 0.107654038
y  0.8807155          NA 0.003523594
z -0.7953560 -0.97945703          NA
i  j   cor    pval
x  y   .88    .048
x  z  -.79    .107
y  z  -.97  0.0035
m <- cor.prob(d)
ut <- upper.tri(m)
lt <- lower.tri(m)
d <- data.frame(i=rep(row.names(m),ncol(m))[as.vector(ut)],
            j=rep(colnames(m),each=nrow(m))[as.vector(ut)],
            cor=m[ut],
            p=m[lt])
d <- data.frame(i=rep(row.names(m),ncol(m))[as.vector(ut)],
            j=rep(colnames(m),each=nrow(m))[as.vector(ut)],
            cor=m[ut],
            p=t(m)[ut])
f1 <- function(m) {
  ut <- upper.tri(m)
  data.frame(i = rownames(m)[row(m)[ut]],
            j = rownames(m)[col(m)[ut]],
            cor=t(m)[ut],
            p=tm[ut])
}
m<-matrix(1:25,5,dimnames=list(letters[1:5],letters[1:5])
> m
  a  b  c  d  e
a 1  6 11 16 21
b 2  7 12 17 22
c 3  8 13 18 23
d 4  9 14 19 24
e 5 10 15 20 25

> f1(m)
   i j cor  p
1  a b   6  2
2  a c  11  3
3  b c  12  8
4  a d  16  4
5  b d  17  9
6  c d  18 14
7  a e  21  5
8  b e  22 10
9  c e  23 15
10 d e  24 20
 cd <- cor.prob(d)
 dcd <- as.data.frame( which( row(cd) < col(cd), arr.ind=TRUE) )
 dcd$pval <- cd[row(cd) < col(cd)]
 dcd$cor <- cd[row(cd) > col(cd)]
 dcd[[2]] <-dimnames(cd)[[2]][dcd$col]
 dcd[[1]] <-dimnames(cd)[[2]][dcd$row]
 dcd
#--------------------
  row col        pval        cor
1   x   y 0.048560420  0.8807155
2   x   z 0.107654038 -0.7953560
3   y   z 0.003523594 -0.9794570