如何在R中的相关矩阵中提取相邻变量之间的值?
我得到了巨大的相关矩阵,但以下只是一个例子:如何在R中的相关矩阵中提取相邻变量之间的值?,r,filter,matrix,R,Filter,Matrix,我得到了巨大的相关矩阵,但以下只是一个例子: set.seed(1234) corrmat <- matrix(round (rnorm (36, 0, 0.3),2), ncol=6) rownames (corrmat) <- colnames (corrmat) <- c("A", "b1", "b2", "C", "L", "ctt") diag(corrmat) <- NA corrmat[upper.tri (corrmat)] <- NA
set.seed(1234)
corrmat <- matrix(round (rnorm (36, 0, 0.3),2), ncol=6)
rownames (corrmat) <- colnames (corrmat) <- c("A", "b1", "b2", "C", "L", "ctt")
diag(corrmat) <- NA
corrmat[upper.tri (corrmat)] <- NA
A b1 b2 C L ctt
A NA NA NA NA NA NA
b1 0.08 NA NA NA NA NA
b2 0.33 -0.17 NA NA NA NA
C -0.70 -0.27 -0.03 NA NA NA
L 0.13 -0.14 -0.15 -0.13 NA NA
ctt 0.15 -0.30 -0.27 0.14 -0.28 NA
> melt(corrmat)
X1 X2 value
1 A A NA
2 b1 A 0.08
3 b2 A 0.33
4 C A -0.70
5 L A 0.13
6 ctt A 0.15
7 A b1 NA
8 b1 b1 NA
9 b2 b1 -0.17
10 C b1 -0.27
11 L b1 -0.14
12 ctt b1 -0.30
13 A b2 NA
14 b1 b2 NA
15 b2 b2 NA
16 C b2 -0.03
17 L b2 -0.15
18 ctt b2 -0.27
19 A C NA
20 b1 C NA
21 b2 C NA
22 C C NA
23 L C -0.13
24 ctt C 0.14
25 A L NA
26 b1 L NA
27 b2 L NA
28 C L NA
29 L L NA
30 ctt L -0.28
31 A ctt NA
32 b1 ctt NA
33 b2 ctt NA
34 C ctt NA
35 L ctt NA
36 ctt ctt NA
因此,它们的顺序是:A-b1-b2-C-L-ctt
有没有一种简单的过滤方法 这里有一种方法:
n = rownames(corrmat)
pair.table = data.frame(X1=head(n, -1), X2=tail(n, -1), value=diag(tail(corrmat, -1)))
结果:
> pair.table
X1 X2 value
1 A b1 0.08
2 b1 b2 -0.17
3 b2 C -0.03
4 C L -0.13
5 L ctt -0.28
下面是一种使用经常被忽略的函数
row()
和col()
请注意,我们在这里将矩阵corrmat
作为向量进行索引,括号中的位表示返回元素,其中每个元素的行索引与每个元素的列索引加1相匹配。使用-1
可以得到超对角线(即对角线上方)
总而言之:
out <- data.frame(X1 = rownames(corrmat)[-1],
X2 = head(colnames(corrmat), -1),
Value = corrmat[row(corrmat) == col(corrmat) + 1])
> out
X1 X2 Value
1 b1 A 0.03
2 b2 b1 -0.02
3 C b2 -0.18
4 L C 0.01
5 ctt L -0.13
out
X1 X2值
1 b1 A 0.03
2 b2 b1-0.02
3 C b2-0.18
4 L C 0.01
5克拉升-0.13
它只是相关矩阵对角线的1。所以,你所需要做的就是把对角线移到那个位置,你就完成了。删除第一行和最后一列,然后就是diag
corrmat <- corrmat[-1,-ncol(corrmat)]
data.frame(X1 = rownames(corrmat), X2 = colnames(corrmat), r = diag(corrmat))
corrmat基于我的解决方案,它使用行/列名称和“查找”平方距离矩阵中的条目生成组合(梳函数)。SIF代表简单交互文件
makeSIF <- function(x) {
# args -
# x - m*m distance or correlation matrix
# @returns data frame in SIF format
#
sif <- as.data.frame(t(combn(as.character(rownames(x)), 2)))
#print(sif)
weight <- apply(sif, 1, indexDMatFromLookup, x)
sif2 <- data.frame(sif, weight)
return(sif2)
}
indexDMatFromLookup <- function(lookup, x) {
return(indexDMat(x, lookup[1], lookup[2]))
}
indexDMat <- function(x, i1,i2) {
return(x[i1,i2])
}
makeSIF如果你不受欢迎。我刚刚用diag
编辑了一个更短的解决方案。好吧,也许大卫·罗宾逊在他的新编辑中就是这么做的。我只是先删除了不必要的行和列。
corrmat <- corrmat[-1,-ncol(corrmat)]
data.frame(X1 = rownames(corrmat), X2 = colnames(corrmat), r = diag(corrmat))
makeSIF <- function(x) {
# args -
# x - m*m distance or correlation matrix
# @returns data frame in SIF format
#
sif <- as.data.frame(t(combn(as.character(rownames(x)), 2)))
#print(sif)
weight <- apply(sif, 1, indexDMatFromLookup, x)
sif2 <- data.frame(sif, weight)
return(sif2)
}
indexDMatFromLookup <- function(lookup, x) {
return(indexDMat(x, lookup[1], lookup[2]))
}
indexDMat <- function(x, i1,i2) {
return(x[i1,i2])
}