R прохождение вектора через ifelse - PullRequest
0 голосов
/ 06 мая 2020

Я хочу ifelse to l oop through и vector, и если условие истинно (значение = либо 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

Он работает, но я надеялся на разные значения в позициях 1,2 и 5 vec2, а не на все те же значения, которые происходят каждый раз. Поэтому я бы надеялся увидеть случайную выборку и в итоге получу

vec2 [1] 1 3 0 0 3

или

vec2 [1] 1 2 0 0 3

Чего-то не хватает в моем c логе и / или коде. Thx, Дж

Ответы [ 3 ]

1 голос
/ 06 мая 2020

Попробуйте это.

vec2 <- sapply(vec1, function(x) ifelse(x == 2 | x == 3, sample(0:3, 1), 0))
1 голос
/ 06 мая 2020

Ваш 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)
0 голосов
/ 06 мая 2020

Это позволяет вам исследовать каждый элемент в векторе:

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

...