Подтвердить что ты не робот

Заменить значения в векторе на основе другого вектора

Я хотел бы заменить значения в векторе (x) значениями из другого вектора (y). Поймать 22: Методы должны быть динамическими для размещения различного количества "уровней" в векторе x. Например, рассмотрим вектор x

x <- sample(c(1, 2, 3, 4, 5), 100, replace = TRUE)
> x
  [1] 2 4 1 1 3 1 1 1 1 1 2 2 5 5 4 5 5 3 4 1 2 2 3 3 3 5 1 3 4 5 5 3 2 4 3 1 3
 [38] 1 4 5 4 1 4 5 4 5 2 4 2 5 3 4 3 1 2 1 1 5 1 4 2 2 5 2 2 4 5 2 4 5 2 5 4 1
 [75] 3 3 4 4 1 1 4 4 2 4 5 4 5 5 4 2 5 2 4 5 3 2 1 1 2 2

где я хотел бы заменить 1s на 100, 2 с на 200 и т.д.

Это можно легко сделать с помощью цикла for, но для больших векторов - несколько 100 тысяч значений - это очень неэффективно. Любые советы по оптимизации кода?

x <- sample(c(1, 2, 3, 4, 5), 100, replace = TRUE)
y <- c(100, 200, 300, 400, 500)
x.lvl <- c(1, 2, 3, 4, 5)
x.temp <- x

for (i in 1:length(y)) {
    x.temp[which(x == x.lvl[i])] <- y[i]
}
4b9b3361

Ответ 1

Работа с факторами может быть быстрее:

xf <- as.factor(x)
y[xf]

Обратите внимание, что levels(xf) дает вам вектор символов, похожий на ваш x.lv. Таким образом, для того, чтобы этот метод работал, элементы y должны соответствовать соответствующим элементам levels(xf).

Ответ 2

Попробуйте с match

y[match(x, x.lvl)]