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

пусть

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

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

  • 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

это не сработало. Не могли бы вы мне помочь?

4 ответов


одним из возможных вариантов было бы использовать 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

надеюсь, что это помогает!


вы можете создать таблицу поиска:

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

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


Если вы преобразовали вектор фактора в символ перед преобразованием его в целое число, ваш код будет работать. Обратите внимание, что фактор внутренне хранится как целое число, поэтому 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

вы могли бы просто сделать

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)

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

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