我有一个75 x 75
方阵。除标签外,其中的所有值均为小数。
我希望得到所有标签对的值都高于或低于我设置的截止值。
说,我有以下
A B C D
A 1 0.2 0.43 0.16
B 0.2 1 0.86 0.28
C 0.43 0.86 1 0.76
D 0.16 0.28 0.76 1
我想要
B C 0.86
C D 0.76
A C 0.43
我怎样才能解决这个问题(没有重复)?
由于
答案 0 :(得分:3)
首先,您需要转换为每个值一行的表示;一种方法是通过转换为矩阵然后转换为data.frame。为了避免重复,在转换为数据帧之前将下三角(可能包括对角线)设置为NA,然后获取数值帧的子集,其中值不是NA。
mtx <- matrix( rnorm(16), 4, 4, dimnames = list( LETTERS[1:4], LETTERS[1:4]))
mtx[lower.tri(mtx, diag=TRUE)] <- NA
dx <- as.data.frame(as.table(mtx))
dx <- subset(dx, !is.na(Freq))
然后,您可以根据需要从结果数据框中获取子集。
> subset(dx, Freq>0)
Var1 Var2 Freq
5 A B 1.9564158
9 A C 1.7188939
14 B D 0.1848542
答案 1 :(得分:2)
一种方法是使用melt
包中的reshape
fn( 更新 >来避免对称矩阵中的重复,并对最终内容进行排序结果)。
> mtx <- matrix( round(10*rnorm(16)),
4, 4, dimnames = list( LETTERS[1:4], LETTERS[1:4]))
> mtx[ upper.tri(mtx)] <- NA
> mtx
A B C D
A -7 NA NA NA
B 23 17 NA NA
C 6 -2 20 NA
D -23 8 15 -6
> require(reshape)
> df <- cbind( data.frame(Row = rownames(mtx)), as.data.frame(mtx))
> df.m <- melt(df, id = 'Row', variable_name = 'Col')
> df.m
Row Col value
1 A A -7
2 B A 23
3 C A 6
4 D A -23
5 A B NA
6 B B 17
7 C B -2
8 D B 8
9 A C NA
10 B C NA
11 C C 20
12 D C 15
13 A D NA
14 B D NA
15 C D NA
16 D D -6
> filt <- subset(df.m, value < 0)
> filt[order(filt$value),]
Row Col value
4 D A -23
1 A A -7
16 D D -6
7 C B -2
当然,您可以按照您想要的方式格式化结果,例如
> cat(with(filt, paste(Row, Col, value, '\n')))
A A -7
D A -23
C B -2
D D -6
答案 2 :(得分:0)
library(fBasics)
Z <- Triang(X)
data.frame(t(apply(which(Z >= 0.43 & Z < 1 ,arr.ind = T),1,
function(y) c(rownames(Z)[y[1]],colnames(Z)[y[2]],Z[y[1],y[2]]))))
给出
X1 X2 X3
A A C 0.43
B B C 0.86
C C D 0.76
答案 3 :(得分:0)
使用矩阵和截止
m <- matrix( rnorm(16), 4, 4, dimnames = list( LETTERS[1:4], LETTERS[1:4]))
cut <- 0
索引满足条件的值,并使用它来提取所需的值和行名称。事后排序
i <- lower.tri(m, diag=TRUE) * m > cut
df <- data.frame(Row=rownames(m)[row(m)[i]], Col=colnames(m)[col(m)[i]],
Val=m[i])
df[order(df$Val),]