用属性提取相关矩阵的一个三角形

时间:2013-08-08 13:35:58

标签: r attributes correlation

我有一个相等行和列的数据帧/矩阵。我想只提取上三角或下三角。

x<-data.frame(matrix(1:25,nrow=5))
colnames(x)<-LETTERS[1:5]
rownames(x)<-LETTERS[1:5]

x[upper.tri(x,diag=F)]

从这个结果来看,不可能说出值来自列和行的组合。所以,我想在结果中有行和列属性。像这样:

Col Row Val
B   A   6
C   A   11
C   B   12
...

我需要为大型相关矩阵执行此操作。 感谢。

4 个答案:

答案 0 :(得分:5)

我只需使用which arr.ind = TRUE,就像这样:

ind <- which( upper.tri(x,diag=F) , arr.ind = TRUE )

data.frame( col = dimnames(x)[[2]][ind[,2]] ,
            row = dimnames(x)[[1]][ind[,1]] ,
            val = x[ ind ] )

   col row val
1    B   A   6
2    C   A  11
3    C   B  12
4    D   A  16
5    D   B  17
6    D   C  18
7    E   A  21
8    E   B  22
9    E   C  23
10   E   D  24

答案 1 :(得分:3)

首先,为了使事情明确无误,我改变了

colnames(x) <- LETTERS[6:10]

使用expand.grid获取类似

的行名和列名
rowCol <- expand.grid(rownames(x), colnames(x))

要从此数据框中获取正确的行,请执行

labs <- rowCol[as.vector(upper.tri(x,diag=F)),]
df <- cbind(labs, x[upper.tri(x,diag=F)])
colnames(df) <- c("Row","Col","Val")
df[,c(2,1,3)]
##    Col Row Val
## 6    G   A   6
## 11   H   A  11
## ...

答案 2 :(得分:1)

......这可能是一个解决方案

nam <-apply(ind, 2, function(y, x) rownames(x)[c(y)], x=x)   
cbind(nam, x[upper.tri(x,diag=F)])

HTH

答案 3 :(得分:0)

下三角形用表达式定义&#34;列索引不大于行索引&#34;。 此代码通过切换&gt;运算符给出下三角形(或更高的值)。使用&#34;&#34;代替0来保持三角形。

x[!(col(x) > index(x))] <- 0

要生成原始帖子中的数据集,我会使用reshape2 :: melt和dplyr ::(filter,select)函数。

首先创建一个要融化的id变量。

x$id <- rownames(x)

然后,

melt(x, id = "id") %>%
 filter(value > 0 ) %>%
   select(Col = variable, Row = id, Val = value)

   Col Row Val
1    B   A   6
2    C   A  11
3    C   B  12
4    D   A  16
5    D   B  17
6    D   C  18
7    E   A  21
8    E   B  22
9    E   C  23
10   E   D  24