В R, как мне сопоставить несколько значений с разными значениями на основе таблицы преобразования? - PullRequest
1 голос
/ 04 мая 2019

У меня большой вектор со многими значениями.У меня также есть таблица, которая показывает, во что каждое из этих значений должно быть преобразовано.Я знаю, как сделать это для одного значения вектора за раз, используя gsub, но я не уверен, как сделать это для всех значений одновременно.По сути, я хочу взять вектор, сослаться на таблицу данных, чтобы выяснить, во что каждый элемент этого вектора должен быть преобразован, и преобразовать его.

Пример:

test <- data.frame(Name = c(rep("TestA", 3), rep("TestB", 4), rep("TestC", 2)))
conversion <- data.table(Original = c("TestA", "TestB", "TestC"), New = c("380", "JK", "LOL"))

test
   Name
1 TestA
2 TestA
3 TestA
4 TestB
5 TestB
6 TestB
7 TestB
8 TestC
9 TestC

conversion
   Original New
1:    TestA 380
2:    TestB  JK
3:    TestC LOL

Что я хочу:

   Name NewName
1 TestA     380
2 TestA     380
3 TestA     380
4 TestB      JK
5 TestB      JK
6 TestB      JK
7 TestB      JK
8 TestC     LOL
9 TestC     LOL

Ответы [ 3 ]

1 голос
/ 04 мая 2019

Я предлагаю tidyverse, он использует естественный язык.

test <- tibble(Name = c(rep("TestA", 3), rep("TestB", 4), rep("TestC", 2)))
conversion <- tibble(Original = c("TestA", "TestB", "TestC"), New = c("380", "JK", "LOL"))

test %>% 
  left_join(conversion, by = c("Name" = "Original"))

1 голос
/ 04 мая 2019

Тебе здесь действительно ничего не нужно, только индексирование векторов. Начиная с вашего кода

test <- data.frame(Name = c(rep("TestA", 3), rep("TestB", 4), rep("TestC", 2)))
conversion <- data.table(Original = c("TestA", "TestB", "TestC"), New = c("380", "JK", "LOL"))

изменить преобразование data.table на вектор:

vec <- conversion$New
names(vec) <- conversion$Original
vec
# TestA TestB TestC 
# "380"  "JK" "LOL" 

Затем добавьте новый столбец путем индексации:

test$NewName <- vec[test$Name]

Кстати, если бы ваша таблица конверсии вводилась вручную, вы могли бы создать vec напрямую:

vec <- c(TestA = "380", TestB = "JK", TestC = "LOL")
1 голос
/ 04 мая 2019

Один из вариантов - data.table join.Преобразуйте набор данных 'test' в data.table (setDT), затем объедините с помощью 'translation' on по столбцам ('Name', 'Original') - так как это разные имена, потому что нужно указывать с помощью =), назначьте (:=) «Новый» из «преобразования», чтобы создать столбец «Новое имя» в «тесте».Если нет подходящих элементов, это будет NA

library(data.table)
setDT(test)[conversion, NewName := New, on = .(Name = Original)]
test
#    Name NewName
#1: TestA     380
#2: TestA     380
#3: TestA     380
#4: TestB      JK
#5: TestB      JK
#6: TestB      JK
#7: TestB      JK
#8: TestC     LOL
#9: TestC     LOL

или без использования каких-либо пакетов

test$NewName <- conversion$New[match(test$Name, conversion$Original)]
...