【问题标题】:Merge data frames and replace NONE with values in R合并数据框并用 R 中的值替换 NONE
【发布时间】:2018-01-02 11:39:33
【问题描述】:

我有两个 data.frames:

data.frame1:
CustID  FirstName   LastName    Address         DOB         City    Phone
132    Mary         K               999 Drive   1/1/2011    Chicago 888-0000
133    Mona         J               222 Road    1/4/2002    NY      999-8888
188    Jack         S               122 Street  9/2/2009    Washin  777-9999
None    Helen       L               111 Rd      1/4/2010        
None    John        M               888 Lane    4/2/2002        
None    Sally       K               222 Street  2/3/2002        


data.frame2                     
CustID FirstName LastName Address   DOB         City
132    Mary      K        999 Drive 1/1/2011    Chicago 
133    Mona      J         222 Road 1/4/2002    NY  
188    Jack      S      122 Street  9/2/2009    Washington  
3338    Helen   L         111 Rd    1/4/2010        
882     John    M       888 Lane    4/2/2002        
976    Sally    K     222 Street    2/3/2002    

Data.frame1 在 CustID 列中包含 None。我需要用 data.frame2 中的 CustID 替换这些 None 并确保两个数据集中的 FirstName、LastName、Address、DOB 列匹配,因为某些名称可以从两个数据集中匹配但具有不同的地址和 DOB - 这些不是同样的人。 我已将这些列从因子转换为字符(不确定是否重要),并应用了 match() 函数但收到了 0 个匹配项(我知道这是错误的) 这是我的代码:

data.frame1$ID[match(c(data.framr2$'FirstName',
                     data.frame2$'LastName',
                     data.frame2$'DOB',
                     data.frame2$'Address'), 
                     c(data.frame1$'FirstName',
                     data.frame1$'LastName',
                     data.frame1$'DOB',
                     data.frame1$'Address'))]   

【问题讨论】:

    标签: r


    【解决方案1】:

    这是使用dplyr 的一种方式。

      library(dplyr)
    
      df1 <- read.table(text = 
           "CustID  FirstName   LastName    Address         DOB         City    Phone
      132    Mary         K               999Drive   1/1/2011    Chicago 888-0000
      133    Mona         J               222Road    1/4/2002    NY      999-8888
      188    Jack         S               122Street  9/2/2009    Washin  777-9999
      None    Helen       L               111Rd      1/4/2010     ''     ''
      None    John        M               888Lane    4/2/2002       ''   ''
      None    Sally       K               222Street  2/3/2002        ''  ''"
      , header = T, stringsAsFactors = F)
    
    
      df2 <- read.table(text=                    
      "CustID FirstName LastName Address   DOB         City
      132    Mary      K        999Drive 1/1/2011    Chicago 
      133    Mona      J         222Road 1/4/2002    NY  
      188    Jack      S      122Street  9/2/2009    Washington  
      3338    Helen   L         111Rd    1/4/2010     ''   
      882     John    M       888Lane    4/2/2002       '' 
      976    Sally    K     222Street    2/3/2002    ''"
      , header = T, stringsAsFactors = F)
    
      df1 %>% left_join(df2 %>% select(-City), by = c('FirstName', 'LastName', 'DOB', 'Address')) %>% 
           mutate(CustID = ifelse(CustID.y == "None", CustID.x, CustID.y)) %>% select(-CustID.x, -CustID.y)
    
    
    
            FirstName LastName   Address      DOB    City    Phone CustID
    1      Mary        K  999Drive 1/1/2011 Chicago 888-0000    132
    2      Mona        J   222Road 1/4/2002      NY 999-8888    133
    3      Jack        S 122Street 9/2/2009  Washin 777-9999    188
    4     Helen        L     111Rd 1/4/2010                    3338
    5      John        M   888Lane 4/2/2002                     882
    6     Sally        K 222Street 2/3/2002                     976
    

    【讨论】:

    • TBT8,看起来您将 table2 与 table1 加入 - 所以如果我需要做相反的事情,因为我将数据从表 2 拉到表 1 中?
    【解决方案2】:

    此代码应说明您必须如何进行:

    • 按“fname”和“lname”合并 data.frames(只考虑缺少 id 的行)
    • 选择合并后的data.frame的“id”列,复制到df1

    例子

    df1 <- data.frame(id=c(NA, 12, NA, 13), 
        fname=c("A","B","Z","D"), 
        lname=c("1","2","3","4"))
    
    df2 <- data.frame(id=c(1, 21, 33, 44), 
        fname=c("Z","A","A","Z")  , 
        lname=c("1","3","1","3"))
    
    df1[!complete.cases(df1),1] <- merge(
        x=df1[!complete.cases(df1[,"id"]),], 
        y=df2, 
        by=c("fname", "lname"))[,"id.y"]
    

    【讨论】:

    • 我尝试了您的代码 aivanov,但收到错误消息:[&lt;-.data.frame(*tmp*, !complete.cases(df1), 3, value = numeric(0)) 中的错误:替换长度为零
    • 我在大约 20 分钟前修复了一个错误,您检查过最新版本吗?
    • aivanov,我收到此错误消息 - 知道如何克服它:[&lt;-.data.frame(*tmp*, !complete.cases(df1), 3, value = c(4897941, :替换有7041行,数据有3837行确实有2个数据框有不同的行数
    猜你喜欢
    • 2016-03-01
    • 2020-07-23
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多