Поиск строки с частичным совпадением в другом фрейме данных и последующая запись ее выходных данных в исходный DF

#r #string #dataframe #for-loop

#r #строка #фрейм данных #for-цикл

Вопрос:

У меня есть фрейм данных «задаватель» и фрейм данных «Final_Town_Contacts». В df задавателе есть столбец «buyer_name» с именем, а в df «Final_Town_Contacts» есть столбец «Имя» и «идентификатор». Проблема в том, что форматы имен немного отличаются, поэтому я не могу использовать функцию сопоставления. Столбец «buyer_name» содержит имя вместе с другими словами, следовательно, он содержит полное содержимое столбца «Имя» и некоторые другие символы. Другая проблема заключается в том, что не все города, включенные в «задавателе» df, включены в «Final_Town_Contacts».

Я хочу найти совпадающие города, а затем записать переменную «id» из фрейма данных «Final_Town_Contacts» для соответствующего города в «задавателе».

Чтобы продемонстрировать, что я хотел бы сделать, вот два фрейма данных:

 # A tibble: 3 x 1
  buyer_name
  <chr>     
1 xx abc    
2 y fdg     
3 z sad 
  
  Name     id
  <chr> <dbl>
1 y        54
2 z        11
3 x        32 
  

Я хотел бы иметь этот вывод в «задавателе» фрейма данных:

  buyer_name     id
  <chr> <dbl>
1 xx abc        32
2 y fdg        54
3 z sad        11
  

Я думал об использовании цикла for:

 for (i in 1:nrow(zadavatele)) {
for (n in 1:nrow(Final_Town_Contacts)){
if(str_detect(zadavatele$buyer_name[i], Final_Town_Contacts$Name[n] amp;amp; 
              !is.na(str_detect(zadavatele$buyer_name[i], Final_Town_Contacts$Name[n]))))
  zadavatele$id[n] = Final_Town_Contacts$`LAU 2`
}
}
  

Но это не сработало. У вас есть какие-либо идеи, как заставить это работать?

Спасибо за вашу помощь!

Ответ №1:

Работает ли это, поэтому будут включены только совпадающие имена из-за внутреннего соединения. Первый символ buyer_name сопоставляется со столбцом Name. Пожалуйста, дайте мне знать, если это не будет иметь место всегда.

 library(dplyr)
df1 %>% mutate(Name = substr(buyer_name,1,1)) %>% inner_join(df2) %>% select(1,3)
Joining, by = "Name"
  buyer_name id
1     xx abc 32
2      y fdg 54
3      z sad 11