6

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

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

4 回答 4

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
于 2013-08-08T14:00:50.470 回答
4

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

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
## ...
于 2013-08-08T13:58:42.710 回答
1

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

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

hth

于 2013-08-08T13:50:06.113 回答
0

下三角用表达式“列索引不大于行索引”定义。这段代码为下三角(或通过切换 > 运算符的上三角)赋予 0 值。使用 "" 代替 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
于 2016-04-25T19:32:43.387 回答