Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中的相关矩阵中提取相邻变量之间的值?_R_Filter_Matrix - Fatal编程技术网

如何在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])
}