Использование каталога для замены значений в векторе R - PullRequest
0 голосов
/ 28 марта 2020

Я импортирую данные о значениях и валютах, среди прочих характеристик c. Валюты являются строками, и мне нужно заменить все из них на номер идентификатора. У меня есть матрица со всеми валютами и идентификаторами в качестве каталога.

Мои матрицы выглядят как

main <- cbind(c("toys", "food"),c(345, 45), c("USD", "EUR"))
cat<-cbind(c("USD", "EUR"), c(1, 2))

Результат, который я хочу получить для

main
[toys,  345,  1
 food,  45,   2]

Ответы [ 3 ]

3 голосов
/ 28 марта 2020

Возможно:

main[,3] <- cat[,2][match(main[,3], cat[,1])]

Вывод:

     [,1]   [,2]  [,3]
[1,] "toys" "345" "1" 
[2,] "food" "45"  "2" 
2 голосов
/ 28 марта 2020

Вот еще один вариант использования left_join из pakcage dplyr, то есть

res <- unname(as.matrix(dplyr::left_join(data.frame(main),
                                         data.frame(cat),
                                         by = c("X3"="X1"))[-3]))

, такой что

> res
     [,1]   [,2]  [,3]
[1,] "toys" "345" "1" 
[2,] "food" "45"  "2" 
1 голос
/ 28 марта 2020

Предполагая, что ОП хочет сопоставить все элементы в 'main', а не в столбце, мы можем использовать match, а затем replace значения

i1 <- match(main, cat[,1])
replace(main, !is.na(i1), cat[,2])
#    [,1]   [,2]  [,3]
#[1,] "toys" "345" "1" 
#[2,] "food" "45"  "2" 

или другое можно создать имя vector и использовать его для замены

v1 <- setNames(cat[,2], cat[,1])[main]
main[!is.na(v1)] <- v1[!is.na(v1)]
main
#    [,1]   [,2]  [,3]
#[1,] "toys" "345" "1" 
#[2,] "food" "45"  "2" 
...