[英]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中。 有两个警告说明。
!is.na
数据
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.