用ifelse在向量中进行R循环。

问题描述 投票:0回答:2

我想让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。

r loops if-statement sample
2个回答
1
投票

您的 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)

1
投票

试试这个

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

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

© www.soinside.com 2019 - 2024. All rights reserved.