Как поменять (перевести) значения внутри вектора

Пусть

vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)

Каковы возможности, чтобы я мог сделать следующий обмен? Swap:

  • 1 --> 3
  • 2 --> 4
  • 3 --> 2
  • 4 --> 1

Я пробовал это:

vetB <- as.factor(vetA)
levels(vetB) <- c(3,4,2,1)
vetA <- as.integer(vetB)

# because
print(vetB)
# [1] 3 4 3 4 3 2 1 3 4 2 4 3 1
#Levels: 3 4 2 1

Это не сработало. Не могли бы вы дать мне руку?

Ответ 1

Один из возможных вариантов заключается в использовании match:

vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)
old=c(1,2,3,4)
new=c(3,4,2,1)
new[match(vetA,old)]

Вывод:

3 4 3 4 3 2 1 3 4 2 4 3 1

Надеюсь, это поможет!

Ответ 2

Вы можете создать справочную таблицу:

vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)
lookup <- setNames(c(3, 4, 2, 1), 1:4)
lookup[vetA]
## 1 2 1 2 1 3 4 1 2 3 2 1 4 
## 3 4 3 4 3 2 1 3 4 2 4 3 1

Значения lookup - это новые значения, а имена - старые. Затем вы можете использовать свой вектор vetA в качестве индекса для выбора новых значений.

Поскольку значения, которые вы заменяете, просто c(1, 2, 3, 4), нет необходимости явно указывать имена, и вы можете получить тот же результат просто с помощью

c(3, 4, 2, 1)[vetA]
## [1] 3 4 3 4 3 2 1 3 4 2 4 3 1

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

Ответ 3

Если вы преобразовали вектор фактора в символ, прежде чем преобразовать его в целое число, ваш код будет работать. Обратите внимание, что фактор внутренне хранится как целое, поэтому as.integer(vetB) возвращает свои целые уровни.

vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)

vetB <- as.factor(vetA)
levels(vetB) <- c(3,4,2,1)
vetA <- as.integer(as.character(vetB))
vetA
# [1] 3 4 3 4 3 2 1 3 4 2 4 3 1

Ответ 4

Вы можете просто сделать

new[order(old)][vetA]

# [1] 3 4 3 4 3 2 1 3 4 2 4 3 1

где

vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)
old <- c(1,2,3,4)
new <- c(3,4,2,1)

Примечание. Это будет работать, а также принятый ответ by @Florian, даже если вектор old не отсортирован. В этом случае другие два ответа не будут работать. Например, если

old <- c(3,2,1,4)
new <- c(3,4,2,1)