Один подход с использованием dplyr:
library(dplyr)
t1 %>%
mutate(Name3 = sub("_[a-z]$", "", Name2)) %>%
left_join(t2, by = c("Name3" = "NameBank")) %>%
select(-Name3)
#output
ID1 Name1 Type1 Name2 TypeBank
1 1 A1 T1 B1 T1
2 2 A2 T2 B2 T4
3 3 A3 T1 B3_a T2
4 4 A4 T3 B4_a T3
Сначала мы генерируем новую переменную, удаляя _
, за которым следует любая буква в конце строки, а затем соединяем два фрейма данных новой переменной.
В зависимости от отношений между Name2
и NameBank
могут подойти и другие манипуляции со строками.
data:
t1 <- read.table(text = "ID1 Name1 Type1 Name2
1 A1 T1 B1
2 A2 T2 B2
3 A3 T1 B3_a
4 A4 T3 B4_a", header = T)
t2 <- read.table(text = "NameBank TypeBank
A1 T1
A2 T2
A3 T1
A4 T3
B1 T1
B2 T4
B3 T2
B4 T3", header = T)
РЕДАКТИРОВАТЬ: возможно, лучшерешение вашей проблемы заключается в использовании charmatch
, который ищет совпадения для элементов своего первого аргумента среди элементов его второго аргумента.: * 10101 *
chrs <- charmatch(t2$NameBank, t1$Name2)
cbind(
t1[chrs[!is.na(chrs)],],
t2[which(!is.na(chrs)),]
)
#output
ID1 Name1 Type1 Name2 NameBank TypeBank
1 1 A1 T1 B1 B1 T1
2 2 A2 T2 B2 B2 T4
3 3 A3 T1 B3_a B3 T2
4 4 A4 T3 B4_a B4 T3
chrs
[1] NA NA NA NA 1 2 3 4
, поэтому 5-й элемент NameBank
соответствует 1-му элементу Name2
и т. д. Завершите, а затем просто используйте эту информацию для правильного связывания двух фреймов данных.