【问题标题】:How to add a column from a df to another df based on other columns? [duplicate]如何根据其他列将列从 df 添加到另一个 df? [复制]
【发布时间】:2022-01-08 19:12:49
【问题描述】:

您好,我有两个数据框。一个缺少数据,我想从另一个具有完整数据的数据框中添加。

这是第一个包含完整数据的数据框。

ID Name Age
012 Dave 45
013 Colin 63
014 Dave 52

这是我想加入第一个数据库的第二个数据库,并使用名称和年龄列从第一个数据库中获取 ID。

ID Name Age
Dave 45
Colin 63
Dave 52

【问题讨论】:

标签: r database dataframe join merge


【解决方案1】:

这是解决您问题的一种方法:

library(dplyr)

my_df1 <- data.frame("ID" = c("012", "013", "014"),
                 "Name" = c("Dave", "Collin", "Dave"),
                 "Age" = c(45, 63, 52),
                 stringsAsFactors = FALSE)

my_df2 <- data.frame("Name" = c("Dave", "Collin", "Dave"),
                 "Age"= c(45, 63, 52),
                 stringsAsFactors = FALSE)


my_df3 <- left_join(my_df2, my_df1, by = c("Name", "Age"))

【讨论】:

    【解决方案2】:

    这也有效:

    ID <- c("012", "013", "014")
    Name <- c("Dave", "Colin", "Dave")
    Age <- c(45, 63, 52)
    df1 <- data.frame(ID, Name, Age)
    df2 <- data.frame(Name, Age)
    
    newtable <- merge(df1, df2, by  = c("Name", "Age")) 
    

    【讨论】:

      【解决方案3】:

      取两个数据集:

      df1 <- data.frame(Name=c("Andy", "Henry", "Tom", "Andy", "Martin"),
                        Age =c(55, 46, 32, 38, 61),
                        ID  =c(1:5))
      
      
      df2 <- data.frame(Name=c("Andy", "Henry", "Tom", "Andy", "Alex"),
                        Age =c(55, 46, 32, 38, 24))
      

      这里有四种不同类型的合并,你可以根据你想对缺失的观察做什么:

      merge(df1, df2, on=c("Name", "Age"))
      merge(df1, df2, on=c("Name", "Age"), all.x=TRUE)
      merge(df1, df2, on=c("Name", "Age"), all.y=TRUE)
      merge(df1, df2, on=c("Name", "Age"), all=TRUE)
      

      您也可以使用 data.table 连接:

      data.table(df1)[data.table(df2), on=c("Name", "Age")]
      

      更正确:

      setDT(df1)
      setDT(df2)
      setkey(df1, "Name", "Age")
      setkey(df2, "Name", "Age")
      df1[df2]
      

      【讨论】:

        【解决方案4】:
        library(dplyr)
        
        my_df1 <- data.frame("ID" = c("012", "013", "014"),
                         "Name" = c("Dave", "Collin", "Dave"),
                         "Age" = c(45, 63, 52),
                         stringsAsFactors = FALSE)
        
        my_df2 <- data.frame("Name" = c("Dave", "Collin", "Dave"),
                         "Age"= c(45, 63, 52),
                         stringsAsFactors = FALSE)
        

        你可以使用merge()

        my_df3 <- merge(df2, df1, by = c("Name", "Age"))
        my_df3
        

        或者您可以使用rbind.fill()先将不同的数据帧合并为一个,然后删除缺少的NA's

        df3<-rbind.fill(df1, df2)
        drop_na(df3) #drop NA's
        
        
        
          ID   Name Age
        1  012   Dave  45
        2  013 Collin  63
        3  014   Dave  52
        4 <NA>   Dave  45
        5 <NA> Collin  63
        6 <NA>   Dave  52
        

        【讨论】:

          猜你喜欢
          • 2023-01-23
          • 1970-01-01
          • 1970-01-01
          • 2022-12-03
          • 2019-11-02
          • 1970-01-01
          • 2020-04-06
          • 1970-01-01
          • 2020-10-24
          相关资源
          最近更新 更多