Замените каждый экземпляр нескольких значений в векторе значением, специфичным для уникального значения

#r

#r

Вопрос:

У меня есть вектор

 a <- c(2, 1, 1, 2)
  

и я хочу заменить каждое уникальное значение другим уникальным значением. Например, я хочу, чтобы 2 -> ‘a’ и 1 -> ‘b’ создавали вектор в том же порядке, что и этот:

 c <- c('a', 'b', 'b', 'a')
  

Я пробовал что-то подобное, но это не сработало:

 replace(a, a %in% unique(a), b)
  

Я хочу избежать ручного перехода ко всем уникальным значениям для обобщения в случае, если a велико. Строки замены — это просто примеры. Решение также должно быть обобщено на совершенно разные строки
или значениями. Например: 2 -> ‘Walter’ и 1 -> ‘Getrude’.

Комментарии:

1. Попробуйте letters[a]

2. Это просто пример, я хочу, чтобы это работало для любой строки. Я добавлю это.

3. Да … хорошая идея…

Ответ №1:

Мы можем использовать match для получения числового индекса, а затем заменить на его основе (используя base R )

 c('a', 'b')[match(a, unique(a))]
#[1] "a" "b" "b" "a"
  

Ответ №2:

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

 library(plyr)

df1 <- data.frame(a=c(2, 1, 1, 2))
df2 <- data.frame(a=c(1, 2), value=c('a', 'b'), stringsAsFactors=FALSE)

result <- join(df1, df2)$value
result

[1] "b" "a" "a" "b"
  

Наличие выделенного фрейма данных или таблицы для отображения значений, вероятно, является хорошей долгосрочной стратегией.

Комментарии:

1. Результатом должно быть [1] «b» «a» «a» «b», потому что порядок важен, должен быть сохранен.

2. @JAQuent Я обновил свой ответ, чтобы использовать join из plyr пакета.