#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
пакета.