我有一个相等行和列的数据帧/矩阵。我想只提取上三角或下三角。
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
...
我需要为大型相关矩阵执行此操作。 感谢。
答案 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