我想让ifelse在向量中循环,如果条件为真(值=2或3),我想对一组进行采样,如果不采样,则将值设为零。 这段代码可以工作,但它似乎只做一次采样,而且相同的值会被循环使用。 能否让它对数组的每个值都执行采样?
vec1 <- sample(1:7, 5, replace = TRUE)
vec2 <- ifelse (vec1 == 2 | vec1 == 3,
sample(0:3, 1),
0
)
vec2
[1] 3 3 0 0 3
它可以工作,但我希望在vec2位置1,2和5有不同的值,而不是每次都有相同的值。 所以我希望能看到随机采样,最后得到的是
vec2 [1] 1 3 0 0 3
或
vec2 [1] 1 2 0 0 3
我的逻辑和代码中缺少一些东西,Thx, J。
您的 sample(0:3, 1)
是 "回收 "的,就像你的 0
......不是每次需要时都要重新运行。你需要预先生成所有的替代品,以便在需要时可以使用。就这样做吧。
ifelse(vec1 %in% c(2, 3), sample(0:3, size = length(vec1), replace = TRUE), 0)
我也喜欢 vec1 %in% c(2, 3)
不止 vec1 == 2 | vec1 == 3
因为如果你有两种以上的可能性... ...它的规模会更好。%in%
很容易添加到,但 == | == | ==
迅速变老。
另外,如果你在乎速度效率,这个会更快。
to_replace = which(vec1 %in% c(2, 3))
vec1[to_replace] = sample(0:3, size = length(to_replace), replace = TRUE)
试试这个
vec2 <- sapply(vec1, function(x) ifelse(x == 2 | x == 3, sample(0:3, 1), 0))
这可以让你检查向量中的每一项。
vec1 <- sample(1:7, 5, replace = TRUE)
my_fn <- function(x) ifelse(x == 2 | x ==3, sample(0:3, 1), 0)
vec2 <- lapply(vec1, my_fn)
unlist(vec2)
答案示例: 0 0 0 2 3