【问题标题】:Merging data frame values合并数据框值
【发布时间】:2016-12-11 15:59:27
【问题描述】:

我想合并由重叠但单独的 tsv 文件组成的 2 个数据帧。 FileA 是一个主列表,而 FileB 包含主列表的一部分,但有许多更新的校对字段。目标是更新 FileA 中文件 B 不同的字段。 样本数据:

filea <-data.frame('ID'=c('555555','66532','333221','333333','545678'),
  'color'=c('red','blaackk','green','green','oops'),
       'count'=c(1,2,300,4,1))

fileb <- data.frame('ID'=c('555555','66532','333221','444333'),
              'color'=c('red','black','green','green'),
                    'count'=c(1,2,3,4))

对于 55532,输出应将“blaackk”更正为“black”,但“oops”应保留,因为它不在 fileB 中。计数“300”应该是“3”。

提前谢谢你!

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    似乎是coalesce 的一个很好的用例,它根据传递给它的顺序从向量中优先选择值。您可以通过ID 列连接两个表,并使用coalesce() 函数从fileb 中选择颜色和计数列,除非对应的记录不存在:

    library(dplyr)
    filea %>% 
        left_join(fileb, by = "ID") %>% 
        mutate(color = coalesce(color.y, color.x), 
               count = coalesce(count.y, count.x)) %>% 
        select(-matches("\\.[xy]"))
    
    #      ID color count
    #1 555555   red     1
    #2  66532 black     2
    #3 333221 green     3
    #4 333333 green     4
    #5 545678  oops     1
    

    或者可能更有效的方法是使用data.table 包:

    setDT(filea)
    setDT(fileb)
    filea
    
    #       ID   color count
    #1: 555555     red     1
    #2:  66532 blaackk     2
    #3: 333221   green   300
    #4: 333333   green     4
    #5: 545678    oops     1
    
    filea[fileb, `:=`(count = i.count, color = i.color), on = "ID"][]
    
    #       ID color count
    #1: 555555   red     1
    #2:  66532 black     2
    #3: 333221 green     3
    #4: 333333 green     4
    #5: 545678  oops     1
    

    数据

    filea <-data.frame('ID'=c('555555','66532','333221','333333','545678'),
                       'color'=c('red','blaackk','green','green','oops'),
                       'count'=c(1,2,300,4,1), stringsAsFactors = F)
    
    fileb <- data.frame('ID'=c('555555','66532','333221','444333'),
                        'color'=c('red','black','green','green'),
                        'count'=c(1,2,3,4), stringsAsFactors = F)
    

    【讨论】:

      【解决方案2】:

      这是一个使用match 的基本 R 解决方案,用于返回替换行的行索引以及替换行。

      filea[!is.na(match(filea$ID, fileb$ID)), names(filea)[-1]] <-
      fileb[!is.na(match(fileb$ID, filea$ID)), names(fileb)[-1]]
      
      filea
            ID color count
      1 555555   red     1
      2  66532 black     2
      3 333221 green     3
      4 333333 green     4
      5 545678  oops     1
      

      为简洁起见,例如,我使用names(filea)[-1] 来返回替换中涉及的data.frame 的列,但您可能希望使用c("color", "count") 中的实际名称向量。这更具体,并允许您指定列的顺序或特定子集,以防它们未在 data.frames 之间对齐,或者一个 data.frame 中有一些不在另一个 data.frame 中。有两个注意事项。

      1. 必须丢弃任何不匹配的!is.na
      2. data.frames 不能有因子。下面,我使用 stringsAsFactors=FALSE 将它们作为字符向量读入

      数据

      filea <-data.frame('ID'=c('555555','66532','333221','333333','545678'),
                         'color'=c('red','blaackk','green','green','oops'),
                         'count'=c(1,2,300,4,1), stringsAsFactors=FALSE)
      
      fileb <- data.frame('ID'=c('555555','66532','333221','444333'),
                          'color'=c('red','black','green','green'),
                          'count'=c(1,2,3,4), stringsAsFactors=FALSE)
      

      【讨论】:

        猜你喜欢
        • 2019-12-04
        • 2019-10-20
        • 1970-01-01
        • 2020-02-15
        • 2020-10-28
        • 2020-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多