Объединение наборов данных с использованием идентификатора с несколькими возможными именами - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть два набора данных, оба с названиями собак. Я хотел бы как-то объединить наборы данных, но у многих собак есть несколько имен, поэтому, например, африканских голых собак также называют африканскими абиссинскими терьерами.

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

Так, например, предположим, что набор данных 1 равен

Breed                           Height (inches)
------------------------------------------------                 
Golden Retriever                20 
Labrador Retriever              22
African Hairless Dog            17 

И набор данных 2 равен

Breed                           Weight (pounds)
------------------------------------------------               
African Abyssinian Terrier      30 
Golden Retriever                60 
Labrador Retriever              65

Я хотел бы получить набор данных, подобный приведенному ниже:

Breed                           Height (inches)           Weight (pounds)
-------------------------------------------------------------------------              
African Hairless Dog            17                        30
Golden Retriever                20                        60
Labrador Retriever              22                        65

Ответы [ 2 ]

0 голосов
/ 04 апреля 2020

Придумал решение, основанное на ответе Джеймса Керрана. Создайте фрейм данных 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'))

Если у кого-то есть более элегантное решение, которое также будет высоко оценено!

0 голосов
/ 04 апреля 2020

Если у вас есть уникальная переменная столбца id в двух фреймах данных, то left_join должна сработать. Например,

df1 = data.frame(id = c(1,2,3), breed = c("African  Abyssinian Terrier", "Golden Retriever","Labrador Retriever"), height= c(17, 20 , 22))

df2 = data.frame(id = c(1,2,3), breed = c("African Hairless Dog", "Golden Retriever","Labrador Retriever"), weight = c(30, 60 , 65))

library(dplyr)
> df1 %>% left_join(df2, by = c("id" = "id"))
  id                     breed.x height              breed.y weight
1  1 African  Abyssinian Terrier     17 African Hairless Dog     30
2  2            Golden Retriever     20     Golden Retriever     60
3  3          Labrador Retriever     22   Labrador Retriever     65

Вы можете сделать небольшую уборку, если хотите

df3 = df1 %>% 
  left_join(df2, by = c("id" = "id")) %>% 
  select(-breed.y) %>% 
  rename(breed = breed.x)
> df3
  id                       breed height weight
1  1 African  Abyssinian Terrier     17     30
2  2            Golden Retriever     20     60
3  3          Labrador Retriever     22     65
...