【问题标题】:R: apply function to matrix columns, but only to certain values (referring to another matrix)R:将函数应用于矩阵列,但仅限于某些值(指另一个矩阵)
【发布时间】:2021-10-19 21:43:23
【问题描述】:

假设我有两个矩阵,data_matrix 包含我的数据,另一个 boolean_matrix 具有相同的结构,但只有 1 和 0,指定我想要获取的来自 data_matrix 的值。

它们看起来像这样:

> set.seed(42)
> data_matrix=matrix(runif(100,0,5), nrow=10)
> boolean_matrix=matrix(rbinom(100, 1, 0.5), nrow=10)
> colnames(data_matrix)=LETTERS[1:10]
> colnames(boolean_matrix)=LETTERS[1:10]
> head(data_matrix)
            A        B         C          D         E         F         G
[1,] 4.574030 2.288709 4.5201569 3.68797809 1.8977962 1.6671361 3.3780364
[2,] 4.685377 3.595561 0.6935508 4.05527571 2.1788579 1.7337412 4.9140860
[3,] 1.430698 4.673361 4.9444586 1.94054141 0.1871552 1.9924271 3.7977213
[4,] 4.152238 1.277144 4.7333412 3.42584865 4.8676996 3.9234639 2.8324421
[5,] 3.208728 2.311464 0.4121878 0.01974169 2.1587562 0.1946825 4.2484486
[6,] 2.595480 4.700073 2.5710589 4.16458040 4.7878830 3.7439769 0.9473697
             H        I           J
[1,] 0.2149440 2.908020 3.337132573
[2,] 0.7023955 0.789526 0.001194483
[3,] 1.0819271 1.795142 1.042849785
[4,] 2.3969928 3.228159 4.665170637
[5,] 0.9870517 3.879117 4.628223743
[6,] 3.5967792 2.818234 3.670471505
> head(boolean_matrix)
     A B C D E F G H I J
[1,] 1 1 0 1 0 1 1 1 1 0
[2,] 0 1 0 1 0 0 1 0 1 1
[3,] 0 1 1 1 0 1 1 0 0 0
[4,] 0 0 1 1 1 0 0 0 0 0
[5,] 1 1 1 1 1 1 1 0 1 0
[6,] 1 1 0 1 1 1 0 0 1 0

我这里要做的很简单,我只想对data_matrix列运行简单的函数,比如maxminlength等。

> apply(data_matrix, 2, max)
       A        B        C        D        E        F        G        H
4.685377 4.891132 4.944459 4.533007 4.867700 3.923464 4.914086 3.596779
       I        J
3.879117 4.665171
> apply(data_matrix, 2, min)
          A           B           C           D           E           F
0.673332986 0.587436808 0.412187790 0.019741694 0.187155164 0.194682456
          G           H           I           J
0.947369677 0.007852771 0.428060325 0.001194483
> apply(data_matrix, 2, length)
 A  B  C  D  E  F  G  H  I  J
10 10 10 10 10 10 10 10 10 10

但是,我只想对 data_matrixboolean_matrix 中具有 1 的那些值执行此操作...不知道如何将其传递给 apply 函数。

谢谢!

【问题讨论】:

    标签: r function matrix apply


    【解决方案1】:

    使用as.logical(),我们可以将您的boolean_matrix 转换为logical (TRUE/FALSE) 矩阵。

    logical_matrix <- as.logical(boolean_matrix)
    logical_matrix
    #>   [1]  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE
    #>  [13]  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE
    #>  [25]  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
    #>  [37]  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE
    #>  [49] FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE FALSE  TRUE
    #>  [61]  TRUE  TRUE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
    #>  [73] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE
    #>  [85]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE
    #>  [97]  TRUE FALSE  TRUE  TRUE
    

    logical_matrix 现在可用于索引data_matrix。我们这样做并设置 所有到NA 的单元格,在logical_matrix 中不是TRUE,因此在boolean_matrix 中有一个0

    data_matrix[!logical_matrix] <- NA
    

    通过指定na.rm = TRUE,我们现在可以将 apply 与函数结合使用 min()max() 等仅获取选定单元格的结果。

    apply(data_matrix, 2, max, na.rm = TRUE)
    #>        A        B        C        D        E        F        G        H 
    #> 4.574030 4.700073 4.944459 4.533007 4.867700 3.743977 4.914086 2.572039 
    #>        I        J 
    #> 3.879117 3.719873
    apply(data_matrix, 2, min, na.rm = TRUE)
    #>           A           B           C           D           E           F 
    #> 0.673332986 2.288708881 0.412187790 0.019741694 2.158756244 0.194682456 
    #>           G           H           I           J 
    #> 3.378036373 0.007852771 0.449902582 0.001194483
    apply(data_matrix, 2, mean, na.rm = TRUE)
    #>         A         B         C         D         E         F         G         H 
    #> 3.0032456 3.2494025 3.4582861 2.7691708 3.7535582 2.0340574 4.0845731 0.9423418 
    #>         I         J 
    #> 2.0022194 2.1205560
    apply(data_matrix, 2, median, na.rm = TRUE)
    #>        A        B        C        D        E        F        G        H 
    #> 3.246845 2.801664 4.354356 3.425849 3.993888 1.992427 4.023085 0.214944 
    #>        I        J 
    #> 1.993376 2.380578
    

    您还提到您想以同样的方式使用length()length(), 虽然每列返回相同的值,因为它也计算单元格 NA.

    apply(data_matrix, 2, length)
    #>  A  B  C  D  E  F  G  H  I  J 
    #> 10 10 10 10 10 10 10 10 10 10
    

    也许apply()ing sum()boolean_matrix 会返回您在此处寻找的结果。

    apply(boolean_matrix, 2, sum)
    #> A B C D E F G H I J 
    #> 6 7 6 9 4 5 4 5 6 4
    

    【讨论】:

      【解决方案2】:

      如果data_matrix 中只有正数,您可以将其与boolean_matrix 相乘,这样boolean_matrix 中为0 的值在data_matrix 中也将变为0

      new_matrix <- data_matrix * boolean_matrix
      

      然后您可以在new_matrix 上应用所有功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 2015-05-08
        • 1970-01-01
        相关资源
        最近更新 更多