【发布时间】: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) 对一个非零元素的索引进行采样,但我不知道如何继续。谢谢!
【问题讨论】:
假设我有一个向量
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 返回非零值的索引sample 给出一个随机索引replace 在特定索引处将值替换为 1
【讨论】:
如果 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
【讨论】: