R用ifelse循环遍历向量

R looping through vector with ifelse

我希望 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

我的逻辑 and/or 代码中缺少一些东西。 谢谢,J

这样您就可以检查向量中的每一项:

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

试试这个。

vec2 <- sapply(vec1, function(x) ifelse(x == 2 | x == 3, sample(0:3, 1), 0))

您的 sample(0:3, 1) 是 "recycled" 就像您的 0 一样...它不会在每次需要时重新 运行。您需要预先生成所有替换项,以便在需要时使用它们。这样做:

ifelse(vec1 %in% c(2, 3), sample(0:3, size = length(vec1), replace = TRUE), 0)

vec1 == 2 | vec1 == 3 相比,我也更喜欢 vec1 %in% c(2, 3),因为它扩展得更好......如果你有超过 2 种可能性,%in% 很容易添加,但是 == | == | == 老得很快。

或者,如果您关心 speed/efficiency,这会更快:

to_replace = which(vec1 %in% c(2, 3))
vec1[to_replace] = sample(0:3, size = length(to_replace), replace = TRUE)