【问题标题】:Combining data sets using an ID with multiple possible names使用具有多个可能名称的 ID 组合数据集
【发布时间】:2020-04-04 05:04:06
【问题描述】:

我有两个数据集,都有犬种名称。我想以某种方式组合数据集,但是很多狗有多个名字,例如非洲无毛犬也被称为非洲阿比西尼亚梗。

我认为这些名称的差异太大,无法通过它们的单词相似性来匹配,所以我想知道匹配它们的最佳方法是什么。

例如,假设数据集 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

【问题讨论】:

    标签: r dataframe join merge data-cleaning


    【解决方案1】:

    如果您在两个数据框中有一个唯一的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
    

    【讨论】:

    • 感谢您的回复。加入是通过身份证号完成的吗?因为我希望它足够概括,这样您就不会通过 id 号匹配,而是通过品种名称匹配。我将编辑问题以使其更加明确。
    • 是的,连接是由id 而不是name 完成的。你想做一个更难的问题,因为我希望品种相似性的概念非常具体:-)
    • 啊,是的,恐怕我正在寻找后者。感谢您的帮助!
    【解决方案2】:

    根据 James Curran 的回答想出了一个解决方案。创建一个数据框df3,其中包含每行一个品种的所有可能昵称,以及一个唯一的 ID 号。使用filter_all从每个数据集中过滤唯一的id号,然后使用唯一的id号连接每个数据集。

    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'))
    

    如果有人有更优雅的解决方案,也将不胜感激!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多