随机矩阵,同时保持 NA 在 R 中的位置

Randomise matrix while keeping position of NAs in R

我有一个值矩阵,其中还包含 NA,例如:

> matrix(rexp(200), 10)
> df[ df < 0.5 ] <- NA

> df
         [,1]      [,2]      [,3]      [,4]     [,5]
[1,] 2.124043 1.6119230        NA 0.7222127 1.400924
[2,] 4.143728        NA        NA 1.0343577       NA
[3,] 2.395984 0.6794447 0.8327695 1.0258656       NA
[4,]       NA        NA        NA        NA 1.421674
[5,]       NA 1.0446031 0.7762776        NA       NA

我想打乱矩阵中的每一列并意识到我可以这样做:

> df<- df[sample(nrow(df)),] 

> df
         [,1]      [,2]      [,3]      [,4]     [,5]
[1,] 2.395984 0.6794447 0.8327695 1.0258656       NA
[2,] 2.124043 1.6119230        NA 0.7222127 1.400924
[3,]       NA        NA        NA        NA 1.421674
[4,] 4.143728        NA        NA 1.0343577       NA
[5,]       NA 1.0446031 0.7762776        NA       NA

但是,我想以这种方式随机化,同时保持 NA 的位置与以前相同。有人知道这样做的简单方法吗?

非常感谢!

将其包装在 apply 中以仅随机化列

apply(X = df,
      MARGIN = 2,
      FUN = function(x) {
                         x[which(!is.na(x))] <- sample(x[which(!is.na(x))])
                         return(x)
                        })