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

标签 r matrix

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

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

我如何将上述相关矩阵(下半部分的相关性,上半部分的 p 值)折叠成一个四列矩阵:两个索引、相关性和 p 值?例如。:
i  j   cor    pval
x  y   .88    .048
x  z  -.79    .107
y  z  -.97  0.0035

我见过the answer to the previous question like this ,但只会给我一个 3 列矩阵,而不是一个四列矩阵,其中 p 值和相关性有单独的列。

任何帮助表示赞赏!

最佳答案

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

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

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])

最后你的标签交换,使用 row()/col(),并将其写成一个函数:
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

如果不是这个,你能解释一下你的预期吗?

关于r - 将 R 中的矩阵展平为四列(索引和上/下三角形),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12116207/

相关文章:

r - 错误: requires numeric/complex matrix/vector arguments when using matrix times vector multiplication

sorting - 从行已排序的 n x m 数组中按升序打印数字

r - 使用 ifelse 从矩阵中提取信息

r - 用 R 中指定单词旁边的单词过滤所有行

r - 在 R 中使用 sf - 将几何图形添加到大型点数据集的最佳方法是什么?

r - 安装 RMySQL 时出错(Ubuntu 14.04 中的 MySQL 5.5.37)

r - 从尾部的 qnorm 获取高精度值

python - 删除 array([]) 括号为矩阵方程创建干净的数组

python - 给定一个 N 边方阵,有没有办法在不使用循环或 if 条件的情况下找到单元格的环值?

r - 在 R 中的绘图中按给定值为一条线着色