【问题标题】:R: randomly sample a nonzero element in a vector and replace other elements with 0R:随机采样向量中的一个非零元素,并将其他元素替换为 0
【发布时间】:2021-03-12 14:09:11
【问题描述】:

假设我有一个向量

vec <- c(0, 1, 0, 0, 0, 1, 1, 1, 1, 2)

如何随机采样一个非零元素并将其他元素变为0?

假设采样的元素是 vec[2],那么得到的向量就是

vec <- c(0, 1, 0, 0, 0, 0, 0, 0, 0, 0)

我知道我可以通过 sample(which(vec != 0), 1) 对一个非零元素的索引进行采样,但我不知道如何继续。谢谢!

【问题讨论】:

    标签: r vector sample


    【解决方案1】:

    你可以试试下面的代码

    > replace(0 * vec, sample(which(vec != 0), 1), 1)
     [1] 0 0 0 0 0 0 0 1 0 0
    

    在哪里

    • which 返回非零值的索引
    • sample 给出一个随机索引
    • replace 在特定索引处将值替换为 1

    【讨论】:

      【解决方案2】:

      如果 which 仅返回 1 个值,请注意 sample 的行为:

      > vec <- c(rep(0, 9), 1)
      > sample(which(vec != 0), 1)
       [1] 4
      

      这会保留向量值(而不是将其转换为 1)并防止向量只有一个非零值,使用 rep 以保证 sample 获得一个包含多个元素的向量:

      vec[-sample(rep(which(vec != 0), 2), 1)] <- 0
      

      【讨论】:

        猜你喜欢
        • 2022-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        相关资源
        最近更新 更多