Search code examples
rdatasetbootstrap-4resamplingstatistics-bootstrap

Resampling on non-NA in matrix


How can we resample only on the non-NA elements and get another matrix 10x10 with NA in lower ?

    mymatrix
            [,1]       [,2]       [,3]        [,4]        [,5]       [,6]          [,7]       [,8] [,9] [,10]
 [1,] -0.6068580 -0.8890714 -0.8088864 -0.37703190  0.97317259  1.6331389 -0.0003412596 -0.9642963  0    NA
 [2,]  2.4474819 -0.7655850  2.1295559  1.74173972  0.22162688 -1.0956214  1.3373400489  1.0344721   NA    NA
 [3,] -0.1344245 -0.2457321 -0.5196433 -0.19503708  1.01253271 -0.3426053 -1.1006913633         NA   NA    NA
 [4,] -0.4566595 -0.8942554  0.4021141 -1.43214088  0.00130944 -0.1228521            NA         NA   NA    NA
 [5,]  1.2089864  0.1007919  0.6669400 -0.01866827 -1.72585991         NA            NA         NA   NA    NA
 [6,]  0.3114062  0.4953031 -0.7354951  0.85718973          NA         NA            NA         NA   NA    NA
 [7,]  0.6323015  2.2380874 -0.6270626          NA          NA         NA            NA         NA   NA    NA
 [8,]  0.5002691  0.7062827         NA          NA          NA         NA            NA         NA   NA    NA
 [9,] -0.4541493         NA         NA          NA          NA         NA            NA         NA   NA    NA
[10,]         NA         NA         NA          NA          NA         NA            NA         NA   NA    NA

Solution

  • You can try this

    mymatrix <- matrix(c(1:3, NA, 4:5, NA, NA, 6, NA, NA, NA, NA, NA, NA, NA), nrow = 4)
    mymatrix
    #     [,1] [,2] [,3] [,4]
    #[1,]    1    4    6   NA
    #[2,]    2    5   NA   NA
    #[3,]    3   NA   NA   NA
    #[4,]   NA   NA   NA   NA
    
    set.seed(1)
    mymatrix[!is.na(mymatrix)] <- sample(x = mymatrix[!is.na(mymatrix)],
                                         size = sum(!is.na(mymatrix)),
                                         replace = FALSE)
    mymatrix
    #     [,1] [,2] [,3] [,4]
    #[1,]    2    4    5   NA
    #[2,]    6    1   NA   NA
    #[3,]    3   NA   NA   NA
    #[4,]   NA   NA   NA   NA
    

    Replace those values in your matrix that are not NA, i.e. mymatrix[!is.na(mymatrix)] by a sample of the same values.