如何从R中的数值矩阵创建二进制矩阵?

时间:2016-11-13 16:28:19

标签: r matrix binary

我试图找出的矩阵运算的伪代码

  1. 如果矩阵单元值< alpha,put 1.
  2. 其他0.
  3. 我想用p值矩阵p.mat创建一个包含alpha的二进制矩阵,但在尝试满足伪代码时我无法正确处理apply

    第一种方法

    # http://stackoverflow.com/a/4236383/54964
    new <- apply(p.mat.p, 1, function(x) 
       if (alpha > x) {
          x <- 0
       } else {
          x <- 1
       }
    )
    

    第二种方法但未通过

    new <- apply(p.mat.p, 1, function(x)
      x <- (x < alpha)
    )
    print(new)
    #Error in match.fun(FUN) : argument "FUN" is missing, with no default
    #Calls: apply -> match.fun
    #Execution halted
    

    试用和代码

    library("psych")
    
    ids <- seq(1,11)
    M.cor <- cor(mtcars)
    colnames(M.cor) <- ids
    rownames(M.cor) <- ids
    
    p.mat <- psych::corr.test(M.cor, adjust = "none", ci = F)
    
    p.mat.p <- p.mat[["p"]]
    
    alpha <- .00000005
    
    # http://stackoverflow.com/a/4236383/54964
    new <- apply(p.mat.p, 1, function(x) 
       if (alpha > x) {
          x <- 0
       } else {
          x <- 1
       }
    )
    
    #Error in alpha > x : 
    #  comparison (6) is possible only for atomic and list types
    #Calls: sapply -> lapply -> FUN
    #Execution halted
    
    带有方形矩阵和alpha值的p值的

    示例

    输入:带有p值的nxn矩阵 = p.mat.p

     # str(p.mat.p)
     num [1:11, 1:11] 0.00 4.04e-09 1.09e-09 4.32e-06 1.78e-05 ...
     - attr(*, "dimnames")=List of 2
      ..$ : chr [1:11] "1" "2" "3" "4" ...
      ..$ : chr [1:11] "1" "2" "3" "4" ...
    
    
     #              1            2            3            4            5
    #1  0.000000e+00 4.037623e-09 1.091445e-09 4.322152e-06 1.780708e-05
    #2  4.037623e-09 0.000000e+00 1.659424e-09 5.625666e-07 5.174268e-05
    #3  1.091445e-09 1.659424e-09 0.000000e+00 1.304240e-05 4.935086e-06
    ...
    

    预期输出:nxn为1和0的二进制矩阵,alpha = 0.2且预期输出为

          [,1] [,2]  [,3] [,4]  [,5]
    [1,] FALSE TRUE FALSE TRUE FALSE
    [2,]  TRUE TRUE  TRUE TRUE  TRUE
    [3,]  TRUE TRUE  TRUE TRUE  TRUE
    

    R:3.3.1
    操作系统:Debian 8.5

1 个答案:

答案 0 :(得分:1)

alpha <- .00000005
p.mat.p <- (p.mat.p < alpha)
str(p.mat.p)
print(p.mat.p)

输出

 logi [1:11, 1:11] TRUE TRUE TRUE FALSE FALSE TRUE ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:11] "1" "2" "3" "4" ...
  ..$ : chr [1:11] "1" "2" "3" "4" ...
       1     2     3     4     5     6     7     8     9    10    11
1   TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
2   TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
3   TRUE  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
4  FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
5  FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
6   TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
7  FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
8  FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE
9  FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE
10 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
11 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE