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