Придумал решение, основанное на ответе Джеймса Керрана. Создайте фрейм данных df3
, который содержит все возможные псевдонимы породы в строке, а также уникальный идентификационный номер. Используйте filter_all
, чтобы отфильтровать уникальный номер идентификатора из каждого набора данных, затем объедините каждый набор данных, используя уникальный номер идентификатора.
df1 <- data.frame(breed = c("Labrador Retriever", "GR","African Abyssinian"), height= c(17, 20 , 22))
df2 <- data.frame(breed = c("African Hairless Dog", "Golden Retriever","Labrador Retriever"), weight = c(30, 60 , 65))
#create data frame, df3
df3 <- data.frame(id = 1:3, breed1 = c("African Hairless Dog", "Golden Retriever","Labrador Retriever"), breed2 = c("African Abyssinian Terrier", "GR","LR"))
id1 <- data.frame()
id2 <- data.frame()
for (i in 1:3){
id <- df3 %>% filter_all(any_vars(grepl(df1$breed[i],.))) %>% select(id)
id <- cbind(id,df1$breed[i]) %>% rename(breed = `df1$breed[i]`)
id1 <- rbind(id1,id)
id <- df3 %>% filter_all(any_vars(grepl(df2$breed[i],.))) %>% select(id)
id <- cbind(id,df2$breed[i]) %>% rename(breed = `df2$breed[i]`)
id2 <- rbind(id2,id)
}
df1 <- left_join(df1,id1) #keep breed name from this data set
df2 <- left_join(df2,id2) %>% select(-breed)
final_data_frame <- left_join(df1,df2, by=c('id'))
Если у кого-то есть более элегантное решение, которое также будет высоко оценено!