【问题标题】:Vectorized solution to random sampling for each row in RR中每一行随机抽样的矢量化解决方案
【发布时间】:2013-08-27 20:59:54
【问题描述】:

我想将下面的 for 循环翻译成矢量化格式:

for (i in 1:100){ if (runif<0.01){b<-sample(1:2,1)} else {b<-NA}}

我正在考虑以下解决方案:

ifelse(runif(100,0,1)<prob_rand, sample(1:no_options,1),NA)

但是这里的问题是样本只执行一次,所以只要满足 if 条件,就会分配相同的样本,而不是为 100 行中的每一行分配一个随机样本

【问题讨论】:

    标签: r vectorization


    【解决方案1】:

    您的第一个示例不起作用,我想您的意思是:

    for (i in 1:100){ if (runif<0.01){b<-sample(1:2,1)} else {b<-NA}}
    

    要使第二部分工作,不要运行sample 一次,而是运行它i 次。

    no_options<-2
    prob_rand<-0.5 # 0.01 is too low to verify that it is working.
    ifelse(runif(100,0,1)<prob_rand, sample(1:no_options,100,replace=TRUE),NA)
    
    #  [1] NA NA NA NA NA  2  1 NA NA NA NA  1  1 NA  1  2  2  2  1 NA  1 NA NA NA  2
    # [26] NA  1 NA  1  2 NA NA NA  2 NA  2  1 NA  2  2  2 NA NA  1  1  1  1 NA  2 NA
    # [51]  2 NA NA  2  1  1  1  2 NA  1 NA  1 NA  1  1  1 NA NA NA NA  1 NA  2 NA NA
    # [76]  1  1 NA  2 NA NA NA NA  2 NA  2 NA  2  2  1  1  1 NA  1 NA NA  2 NA NA  1
    

    【讨论】:

    • 是否可以指定而不是 NA 什么?所以如果那里已经有一个值,那么就保留那个值?
    • 我很难理解你的意思。但我猜你的意思是某个向量 b 已经存在,如果掷骰子大于 prob_rand,你想替换其中的值,但如果不是,那么就不要管 b。如果是这种情况,那么只需将NA 替换为b
    【解决方案2】:

    如何先制作样本向量,然后根据prob_rand进行子集化...

    x <- sample( 1:no_options , 100 , repl = TRUE )
    x[ runif(100) > prob_rand ] <- NA
    

    【讨论】:

      【解决方案3】:

      在data.frame中可能是?

      df = data.frame(r=runif(100))
      df$b = ifelse(df$r<0.01,sample(1:2,1),NA)
      

      【讨论】:

        【解决方案4】:

        你也可以使用 rbinom

        n <- 100
        (runif(n) < 0.1) * sample(2, n, replace = TRUE)
        rbinom(n, size = 1, prob = 0.1) * sample(2, n, replace = TRUE)
        

        这将给出 0、1、2 而不是 NA、1、2。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多