Если ваши ключи будут только положительными целыми числами, вы можете использовать значение индекса, предложенное Сореном в ответе на этот вопрос: https://stackoverflow.com/a/54990917
Если нет, вы все равно можете использовать *Стратегия на основе 1005 *, которую вы описали выше, сохраняя свои числа в names(lookup)
как символ, а затем используя as.character
, чтобы преобразовать вектор числовых ключей в правильную форму для сопоставления:
y <- c(1, -2, 1.3, -5)
lookup_num <- c('1' = 'Cat', '-2' = 'Dog', '1.3' = 'Fish', '-5' = 'Hedgehog')
lookup_num[as.character(y)]
1 -2 1.3 -5
"Cat" "Dog" "Fish" "Hedgehog"
Один из возможных недостатковэтот подход заключается в том, что, поскольку числа будут обрабатываться как строки, они не будут соответствовать 0,0 с 0 или 3,00 с 3, поэтому вам нужно убедиться, что ваши числовые значения чистые.
Если производительность не так важна, вы можете изменить порядок ключей и значений, указав числовой ключ в качестве значения, а значение поиска символов - в качестве имени, а затем использовать sapply
для поиска каждого ключа:
lookup_num <- c('Cat' = 1, 'Dog' = -2, 'Fish' = 1.3, 'Hedgehog' = -5)
keys <- c(-2, 1.3, -2, 1)
sapply(keys, function(x) which(lookup_num == x))
Dog Fish Dog Cat
2 3 2 1
Преимущество заключается в использовании сопоставления чисел, которое предотвращает проблемы, вызванные переменным форматированием чисел, и дает вам большую гибкость вtch (например, вы могли бы сделать: abs(lookup_num - x) < 0.1
, чтобы добавить место для маневра в вашем числовом соответствии)
Недостатком является то, что он имеет довольно плохую временную сложность, но если ваш список ключей и / или таблица поискане большие, вы не заметите вообще.