R-версия Vlookup с несколькими совпадениями на ячейку - PullRequest
1 голос
/ 28 марта 2019

У меня есть вектор с числами и справочная таблица.Я хочу, чтобы числа заменялись описанием из таблицы поиска.

Это легко, когда векторы прямолинейны, как в следующем примере:

> variable <- sample(1:5, 10, replace=T)
> variable
 [1] 5 4 5 3 2 3 2 3 5 2
> 
> lookup <- data.frame(var = 1:5, description=LETTERS[1:5])
> lookup
  var description
1   1           A
2   2           B
3   3           C
4   4           D
5   5           E
> 
> with(lookup, description[match(variable, var)])
 [1] E D E C B C B C E B
Levels: A B C D E

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

variable <- c("1", "2^3", "1^5", "4", "4")

Я хотел бы, чтобы вектор возвращал, чтобы дать:

c("A", "B^C", "A^E", "D", "D")

Любая помощь приветствуется!

С уважением, Люк

Ответы [ 3 ]

2 голосов
/ 28 марта 2019

Если у вас есть только один символ совпадения и замены, вы можете использовать chartr

chartr(paste0(lookup$var, collapse = ""), 
       paste0(lookup$description, collapse = ""), variable)

#[1] "A"   "B^C" "A^E" "D"   "D"  

chartr в основном говорит, что заменить

paste0(lookup$var, collapse = "")
#[1] "12345"

с

paste0(lookup$description, collapse = "")
#[1] "ABCDE"

Это также полезно, поскольку оно не изменяется или не возвращает NA для символов, которые не совпадают.

2 голосов
/ 28 марта 2019

Вы можете использовать scan для разбора текста на цифры, которые затем можно использовать в качестве индекса для выбора элементов, которые затем можно сложить вместе. Добавьте quiet = TRUE, чтобы отключить чтение сообщений.

sapply(variable, function(t) { 
              paste( lookup$description[ scan(text=t, sep="^")], collapse="^")} )

Read 1 item
Read 2 items
Read 2 items
Read 1 item
Read 1 item
    1   2^3   1^5     4     4 
  "A" "B^C" "A^E"   "D"   "D" 
2 голосов
/ 28 марта 2019

Как уже упоминалось в комментариях, есть несколько шагов, необходимых для достижения желаемого результата. Следующее разделяет вашу переменную, индексирует результаты по переменной описания, а затем использует вставку для свертывания нескольких элементов.

sapply(strsplit(variable, "\\^"), function(x) paste0(lookup$description[as.numeric(x)], collapse = "^"))
[1] "A"   "B^C" "A^E" "D"   "D"  
...