Ответ 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
Надеюсь, это поможет!
Пусть
vetA <- c(1,2,1,2,1,3,4,1,2,3,2,1,4)
Каковы возможности, чтобы я мог сделать следующий обмен? Swap:
-->
3-->
4-->
2-->
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
Это не сработало. Не могли бы вы дать мне руку?
Один из возможных вариантов заключается в использовании 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)
Примечание. Это будет работать, а также принятый ответ by @Florian, даже если вектор old
не отсортирован. В этом случае другие два ответа не будут работать. Например, если
old <- c(3,2,1,4)
new <- c(3,4,2,1)