R:随机抽取一个向量中的非零元素,并将其他元素替换为0

R: randomly sample a nonzero element in a vector and replace other elements with 0

假设我有一个向量

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) 对一个非零元素的索引进行采样,但我不确定如何继续。谢谢!

您可以试试下面的代码

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

哪里

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

如果 which returns 只有 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