Частичное совпадение для набора данных, использующего вектор в R - PullRequest
0 голосов
/ 10 марта 2020

У меня есть один набор данных, состоящий из названий марок автомобилей с другими данными ( test1 ) и вектора всех уникальных сокращенных названий марок автомобилей ( test ).

test<-c("Rolls Royce", "Toyota", "Tesla", "BMW","Ford", "Mercedes")
test1<- data.frame(Brand = c("Mercedes Benz", "Bayerische Motoren Werke (BMW)",
                 "Ford Motor Corp.", "Rolls Royce", 
                 "Tesla", "Mercedes Benz", "Ford Motor"),
      Ratings = c(6,6,4,9,8,8,6))

Как сделать частичное совпадение строки с набором данных ( test1 ), используя вектор строки уникальных имен автомобилей ( test ) и изменить марку значения test1 для поиска и сопоставления значений test ?

Я могу сделать это для каждой записи, хотя я хотел бы посмотреть, есть ли более быстрый способ получить результат:

library(data.table)
test1[test1$Brand %like% "Rolls Royce", ]$Brand <-"Rolls Royce"
test1[test1$Brand %like% "Toyota", ]$Brand <-"Toyota"
test1[test1$Brand %like% "Tesla", ]$Brand <-"Tesla"
test1[test1$Brand %like% "BMW", ]$Brand <-"BMW"
test1[test1$Brand %like% "Ford", ]$Brand <-"Ford"
test1[test1$Brand %like% "Mercedes", ]$Brand <-"Mercedes"

Это результат, который я хотел бы получить для приведенного выше примера:

data.frame(Brand = c("Mercedes", "BMW",
                 "Ford", "Rolls Royce", 
                 "Tesla", "Mercedes", "Ford"),
      Ratings = c(6,6,4,9,8,8,6))

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Использование agrep нечеткого сопоставления.

test1 <- transform(test1, 
                   Brand.new=gsub("\\d+$", "", names(sort(unlist(sapply(test, function(x) 
                     agrep(x, Brand)))))))
test1
#                            Brand Ratings   Brand.new
# 1                  Mercedes Benz       6    Mercedes
# 2 Bayerische Motoren Werke (BMW)       6         BMW
# 3               Ford Motor Corp.       4        Ford
# 4                    Rolls Royce       9 Rolls Royce
# 5                          Tesla       8       Tesla
# 6                  Mercedes Benz       8    Mercedes
# 7                     Ford Motor       6        Ford
0 голосов
/ 10 марта 2020

Мы можем вставить строки в test вместе и использовать str_extract

stringr::str_extract(test1$Brand, paste0('\\b', test, '\\b', collapse = "|")) 
#[1] "Mercedes" "BMW"  "Ford"   "Rolls Royce" "Tesla"  "Mercedes"    "Ford"  

В шаблон добавляются границы слов (\\b), чтобы избежать совпадения с неполными словами, такими как "ford" с "afford".

...