如何使用单元名称的行名和列名获取与R中的条件匹配的矩阵中的单元名称(例如,相关矩阵)?

时间:2016-07-29 02:28:37

标签: r

我经常需要处理变量集之间的大相关矩阵,并且我想知道哪些相关满足给定条件(例如,高于.2或.3或绝对.2或.3)等等。因此,给定一个相关矩阵,如果我能得到形成满足条件的相关性的变量对,那将是有用的。

为了使它更具体,这里是矩阵

x <- matrix(1:9, nrow = 3)
rownames(x) <- colnames(x) <- c("a", "b", "c")
x

# x
#   a b c
# a 1 4 7
# b 2 5 8
# c 3 6 9

我想要一个允许我指定单元格条件的函数,然后返回匹配单元格的名称。

  • 例如,&gt; 8返回&#34; c:c&#34;
  • 奇数返回&#34; a:a&#34;,&#34; c:a&#34;,...&#34; c:c&#34;

2 个答案:

答案 0 :(得分:1)

以下函数采用矩阵和函数。对于每个单元格值,该函数应返回TRUE / FALSE。

使用样本矩阵:

x <- matrix(1:9, nrow = 3)
rownames(x) <- colnames(x) <- c("a", "b", "c")

功能是:

cell_matches <- function(x, FUN =  function(X) X > .2) {
    cellnames <- outer(row.names(x), colnames(x), function(X, Y) paste0(X, ":", Y))
    cellnames[FUN(x) ]
}

因此,使用上面的矩阵工作:

cell_matches(x, function(X) X > 8)
# [1] "c:c"
cell_matches(x, function(X) X %% 2 == 1)
# [1] "a:a" "c:a" "b:b" "a:c" "c:c"

应用于相关矩阵:

# correlations above .80
cell_matches(cor(mtcars), function(X) X > .80 & X != 1)    
# [1] "disp:cyl" "hp:cyl"   "cyl:disp" "wt:disp"  "cyl:hp"   "disp:wt" 

答案 1 :(得分:1)

check_cor <- function(mat,FUN)
{
  apply(which(FUN(x), arr.ind = TRUE),1,
    function(i)
     {
      paste0(row.names(mat)[i[1]],':',colnames(mat)[i[2]])
     }
  )
}

check_cor(cor(mtcars), function(X) X > .80 & X != 1)