繁体   English   中英

合并数据框值

[英]Merging data frame values

我想合并由重叠但独立的tsv文件制成的2个数据帧。 FileA是主列表,而FileB包含主列表的一部分,但具有许多更新的校对字段。 目标是更新文件A中文件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”。

先感谢您!

似乎是coalesce一个很好的用例, coalesce根据传递给它的顺序从向量中优先选择值。 您可以通过ID列将两个表连接起来,并使用fileb 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)

这是使用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.frame对齐或一个data.frame中的某些不在另一data.frame中。 有两个警告说明。

  1. 任何不匹配项都必须舍弃!is.na
  2. data.frame不能有因素。 下面,我使用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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM