【问题标题】:replacing randomly values in an existing matrix in R随机替换R中现有矩阵中的值
【发布时间】:2013-04-09 15:53:17
【问题描述】:

我有一个现有矩阵,我想以随机统一的方式用 NA 替换一些现有值。

我尝试使用以下内容,但它仅将 392 个值替换为 NA,而不是我预期的 452。我究竟做错了什么?

N <- 452

ind1 <- (runif(N,2,length(macro_complet$Sod)))

macro_complet$Sod[ind1] <- NA

summary(macro_complet$Sod)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
  0.3222   0.9138   1.0790   1.1360   1.3010   2.8610 392.0000 

我的数据是这样的

> str(macro_complet)
'data.frame':   1504 obs. of  26 variables:
 $ Sod                     : num  8.6 13.1 12 13.8 12.9 10 7 14.8 11.3 4.9 ...
 $ Azo                     : num  2 1.7 2.2 1.9 1.89 1.61 1.72 2.1 1.63 2 ...
 $ Cal                     : num  26 28.1 24 28.5 24.5 24 17.4 26.6 24.8 10.5 ...
 $ Bic                     : num  72 82 81 84 77 68 66 81 70 37.8 ...
 $ DBO                     : num  3 2.2 3 2.7 3.3 3 3.2 2.9 2.8 2 ...
 $ AzoK                    : num  0.7 0.7 0.9 0.8 0.7 0.7 0.7 0.9 0.7 0.7 ...
 $ Orho                    : num  0.3 0.2 0.31 0.19 0.19 0.2 0.16 0.24 0.2 0.01 ...
 $ Ammo                    : num  0.12 0.16 0.15 0.13 0.19 0.22 0.19 0.16 0.17 0.08 ...
 $ Carb                    : num  0.3 0.3 2 0.3 0.3 0.3 0.3 0.3 0.3 0.5 ...
 $ Ox                      : num  10.2 9.7 9.8 9.6 9.7 9.1 9.1 8.1 9.7 10.6 ...
 $ Mag                     : num  5.5 6.5 6.3 7 6.4 5.1 6 6.7 5.7 2 ...
 $ Nit                     : num  4.2 4.7 5.7 4.6 4.2 3.5 4.9 4.5 4.2 2.8 ...
 $ Matsu                   : num  17 9 24 15 17 19 20 19 13 3.9 ...
 $ Tp                      : num  10.5 9.7 11.9 12 12.9 11.2 12.8 13.7 11.5 10.6 ...
 $ Co                      : num  3 3.45 3.3 3.54 2.7 2.7 3.3 3.49 2.8 1.8 ...
 $ Ch                      : num  17 24 22 28 25 19 13 28 23 6.4 ...
 $ Cu                      : num  25 15 20 20 15 20 15 15 20 15 ...
 $ Po                      : num  3.5 3.8 4 3.6 3.8 3.7 3 4.2 3.7 0.4 ...
 $ Ph                      : num  0.2 0.17 0.2 0.14 0.18 0.2 0.17 0.17 0.17 0.01 ...
 $ Cnd                     : int  226 275 285 295 272 225 267 283 251 61 ...
 $ Txs                     : num  93 88 89 86 87 88 84 80 91 94 ...
 $ Niti                    : num  0.06 0.09 0.07 0.06 0.08 0.07 0.08 0.11 0.1 0.01 ...
 $ Dt                      : num  9 9.7 9 10.2 8 8 7 9.4 8.5 3 ...
 $ H                       : num  7.6 7.7 7.6 7.7 7.55 7.4 7.3 7.5 7.5 7.6 ...
 $ Dco                     : int  17 12 15 13 15 20 16 14 12 7 ...
 $ Sf                      : num  22 20.5 18 22.2 22.1 21 11.6 21.7 21.9 6.8 ...

我也尝试仅对单个变量执行此操作,但得到了相同的结果。

我使用

将我的数据框转换为矩阵
as.matrix(n1)

然后我只为一个变量替换了一些值

N <- 300

ind <- (runif(N,1,length(n1$Sodium)))

n1$Sodium[ind] <- NA

但是,使用summary() 我观察到只有 262 个值被替换,而不是预期的 300 个。我做错了什么?

summary(n1$Sodium)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max.     NA's 
  0.3222   0.8976   1.0790   1.1320   1.3010   2.8610 262.0000

【问题讨论】:

    标签: r


    【解决方案1】:

    试试这个。这将在不替换的情况下均匀地对您的矩阵进行采样(因此不会选择和替换相同的值两次)。如果您想要其他分布,可以使用prob 参数修改权重(请参阅?sample

    vec <- matrix(1:25, nrow = 5)
    vec[sample(1:length(vec), 4, replace = FALSE)] <- NA
    
    vec
         [,1] [,2] [,3] [,4] [,5]
    [1,]   NA    6   NA   16   NA
    [2,]   NA    7   12   17   22
    [3,]    3    8   13   18   23
    [4,]    4    9   14   19   24
    [5,]    5   10   15   20   25
    

    【讨论】:

    • 谢谢,但这会生成随机统一的 NA,我真的需要 NA 的替换值保持统一的方式
    • 当我使用更大的矩阵(1000 行和 26 列)仅替换 4 个值时,这不起作用,它将 4 列的所有值替换为 NA,我该如何更改它以便控制要替换的值的数量?
    • @EvaSerrano 我宁愿不猜测发生了什么。请编辑您的问题以包含您正在使用的代码。
    • 所以我尝试使用 as macro_complet[sample(length(macro_complet$Sodium), 250, replace =FALSE)]
    • @EvaSerrano 您能否编辑您的问题并向我们展示macro_complet 的外观(使用str())?
    【解决方案2】:

    您必须在正确的位置应用runif,这是 vec 的索引。 (你现在拥有它的方式,你要求RNANA之间的均匀分布中抽取随机数,这当然没有意义,所以它会给你回NaNs)

    试试吧:

            N  <-  5                                   # the number of random values to replace
          inds <- round ( runif(N, 1, length(vec)) )   # draw random values from [1, length(vec)]
     vec[inds] <- NA                                   # use the random values as indicies to vec, for which to replace
    

    请注意,不必使用round(.),因为[[ 将接受数字,但它们都会被四舍五入向下默认情况下,它比统一的 dist 略小。

    【讨论】:

    • 将此应用于一个特定的列,它替换了 350 的 336 个值,我想替换任何关于我做错了什么的想法? N &lt;- 375inds &lt;- (runif(N,1,length(vec$Sodium)))vec$Sodium[inds] &lt;- NA
    • Eva,请参阅@Roman-Lustrik 的评论。您需要使用代码和示例数据编辑您的问题。或者,您可以打开一个新问题作为此问题的后续。
    【解决方案3】:

    我们可以使用

    vec[sample(seq_along(vec), 4, replace = FALSE)] <- NA
    

    【讨论】:

    • 就我而言,这个解决方案对我来说效果最好,因为它保证我得到了正确数量的随机选择的元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 2014-12-07
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多