【问题标题】:Replace randomly 30% of non-zero elements in a matrix to 0 using R使用 R 将矩阵中 30% 的非零元素随机替换为 0
【发布时间】:2022-07-11 18:36:15
【问题描述】:

我有一个巨大的矩阵,比如 M1,我想创建一个新矩阵 M2,其中 M2 将是 M1 的副本,并将 M1 的 30% 的非零值替换为 0。

请告诉我如何解决这个问题。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    sample from which(m > 0),我用<- 999来演示,换成<- 0就好了。 which 给出了非零的索引,我们从中抽取 30%。

    m
    #       [,1] [,2] [,3] [,4] [,5]
    #  [1,]    9    4    9    7    3
    #  [2,]    9    7    1    8    4
    #  [3,]    2    9    9    3    0
    #  [4,]    8    2    9    6    9
    #  [5,]    6    4    0    0    4
    #  [6,]    5    9    5    8    9
    #  [7,]    7    9    3    0    8
    #  [8,]    1    1    9    2    6
    #  [9,]    6    4    4    9    9
    # [10,]    7    5    8    6    6
    
    m[sample(which(m > 0), length(m)*.3)] <- 999
    m
    #       [,1] [,2] [,3] [,4] [,5]
    #  [1,]    9    4  999    7  999
    #  [2,]  999    7    1    8    4
    #  [3,]  999    9  999    3    0
    #  [4,]  999    2  999    6  999
    #  [5,]  999    4    0    0    4
    #  [6,]  999    9    5  999    9
    #  [7,]    7    9  999    0    8
    #  [8,]    1    1    9  999    6
    #  [9,]    6    4  999  999    9
    # [10,]    7    5    8    6    6
    
    sum(m == 999)/length(m)  ## check
    # [1] 0.3
    

    数据:

    set.seed(42)
    m <- matrix(trunc(runif(50, 0, 1)*10), 10, 5)
    

    【讨论】:

    • 如果我错了,请纠正我。您是否替换了总矩阵的 30%,而不是替换 OP 要求的矩阵的非零元素的 30%?
    • @Quinten 30% 的非零实际上是我打算用 999 演示的。我已经添加了一些解释。
    【解决方案2】:

    诀窍是通过像这样的非零元素过滤矩阵:

    M1<-matrix(rnorm(36),nrow=6)
    M2 <- M1
    M2
    #>            [,1]       [,2]       [,3]       [,4]       [,5]       [,6]
    #> [1,]  1.1450903 -1.3354652  1.7408616  2.4104801  1.0190374 -0.4452658
    #> [2,] -0.6193147  0.6247960  0.8880114  0.2063487  1.4564834 -1.6591764
    #> [3,] -1.4440763 -0.1740776  2.1646262 -1.3795811 -0.2231788 -2.1524281
    #> [4,]  1.0929878  2.4982284 -1.5304989  1.0759637  0.2585276  0.3428240
    #> [5,] -1.4013196 -0.3208720  0.8025738 -0.7251131  0.1134538 -1.2704551
    #> [6,] -0.7992393  0.5610579  2.0940327  1.1937530 -1.5585291 -1.0766868
    M2[sample(which(M2 > 0), length(M2[M2!=0])*0.3, replace = FALSE)] = 0
    M2
    #>            [,1]       [,2]       [,3]       [,4]       [,5]       [,6]
    #> [1,]  1.1450903 -1.3354652  0.0000000  0.0000000  0.0000000 -0.4452658
    #> [2,] -0.6193147  0.0000000  0.8880114  0.2063487  0.0000000 -1.6591764
    #> [3,] -1.4440763 -0.1740776  2.1646262 -1.3795811 -0.2231788 -2.1524281
    #> [4,]  0.0000000  0.0000000 -1.5304989  1.0759637  0.2585276  0.0000000
    #> [5,] -1.4013196 -0.3208720  0.8025738 -0.7251131  0.0000000 -1.2704551
    #> [6,] -0.7992393  0.5610579  0.0000000  1.1937530 -1.5585291 -1.0766868
    

    reprex package 创建于 2022-07-11 (v2.0.1)

    cmets中提到的选项jay

    M1<-matrix(rnorm(36),nrow=6)
    M2 <- M1
    M2
    #>            [,1]       [,2]       [,3]       [,4]       [,5]       [,6]
    #> [1,]  0.2704036 1.66744279  1.2249968  0.7105401  0.2930494  0.3019442
    #> [2,]  0.6701630 0.23103360  0.3433342 -0.9176159  0.2890372 -1.3139269
    #> [3,] -0.7845245 0.64272243  0.3152463  0.2794443  0.3818046 -1.7073781
    #> [4,]  1.3994086 0.04721819 -0.1364107 -0.2889496  1.7605232  1.0270522
    #> [5,]  0.8934011 0.53878503 -1.6008799 -0.4516311 -1.1541206 -1.3896758
    #> [6,]  0.3205831 1.15597968 -0.4654826 -1.3999804 -1.0597505  0.2982040
    i <- M2 != 0 
    M2[i] <- replace(M2[i], sample(sum(i), sum(i)*.3), 999)
    M2
    #>             [,1]       [,2]        [,3]        [,4]        [,5]        [,6]
    #> [1,]   0.2704036 1.66744279   1.2249968 999.0000000 999.0000000   0.3019442
    #> [2,]   0.6701630 0.23103360   0.3433342  -0.9176159   0.2890372 999.0000000
    #> [3,]  -0.7845245 0.64272243 999.0000000   0.2794443   0.3818046  -1.7073781
    #> [4,]   1.3994086 0.04721819  -0.1364107  -0.2889496 999.0000000   1.0270522
    #> [5,] 999.0000000 0.53878503 999.0000000  -0.4516311  -1.1541206 999.0000000
    #> [6,]   0.3205831 1.15597968  -0.4654826  -1.3999804 999.0000000 999.0000000
    

    reprex package (v2.0.1) 于 2022-07-11 创建

    第一个答案

    你可以sample通过你的矩阵,在这里你可以通过说元素的数量是你矩阵的30%来指定你想要替换为0的元素的数量。您可以使用以下代码:

    M1<-matrix(rnorm(36),nrow=6)
    M1
    #>            [,1]       [,2]        [,3]       [,4]        [,5]       [,6]
    #> [1,] -1.4181422 -0.1675572 -0.07126163 -0.2250808  0.06538817  0.7096829
    #> [2,]  0.1265111  0.6535900 -0.81718699  0.1660550 -0.84969221  0.5222353
    #> [3,] -0.5860745 -0.7130558  0.80823046  0.5601937  2.06109461 -1.4000195
    #> [4,] -1.8507512 -0.2643667  0.62158830 -1.0455708 -1.28048923 -0.3291040
    #> [5,] -1.5950047  0.6611776  1.19810322 -0.8927425 -0.70925100 -1.8455213
    #> [6,] -1.2737187 -1.3739572 -0.92623331 -0.1034901  1.12354331 -0.6559306
    M1[sample(1:length(M1), length(M1)*0.3, replace = FALSE)] <- 0
    M2 <- M1
    M2
    #>            [,1]       [,2]       [,3]       [,4]       [,5]       [,6]
    #> [1,] -1.4181422 -0.1675572  0.0000000  0.0000000  0.0000000  0.0000000
    #> [2,]  0.1265111  0.6535900 -0.8171870  0.1660550 -0.8496922  0.0000000
    #> [3,] -0.5860745  0.0000000  0.8082305  0.5601937  2.0610946 -1.4000195
    #> [4,] -1.8507512 -0.2643667  0.6215883  0.0000000 -1.2804892 -0.3291040
    #> [5,] -1.5950047  0.6611776  0.0000000 -0.8927425 -0.7092510 -1.8455213
    #> [6,] -1.2737187 -1.3739572  0.0000000  0.0000000  1.1235433 -0.6559306
    

    reprex package (v2.0.1) 于 2022-07-11 创建

    【讨论】:

    • 嘿,非常感谢,但问题是 M1 也有很多零,我必须替换 30% 的非零值。
    • M1[sample(1:length(M1[M1!=0]), length(M1[M1!=0])*0.3, replace = FALSE)] = 0.
    • 我认为上面的方法可以吗?
    • 这不对,OP 想要 非零 值的 30%。
    • @Quinten 是的。为了避免which,我们可以像i &lt;- M2 != 0; M2[i] &lt;- replace(M2[i], sample(sum(i), sum(i)*.3), 999) 那样做某事,但它不会给出30%。
    猜你喜欢
    • 2014-12-07
    • 2014-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2015-05-12
    相关资源
    最近更新 更多