合并数据帧并覆盖值 [英] Merge data frames and overwrite values

查看:86
本文介绍了合并数据帧并覆盖值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何合并2个相似的数据框,但其中一个具有更高的重要性?

How do I merge 2 similar data frames but have one with greater importance?

例如:

数据框1

Date      Col1    Col2
jan         2      1
feb         4      2
march       6      3
april       8      NA

数据框2

Date      Col2    Col3
jan         9      10
feb         8      20
march       7      30
april       6      40

按日期将其合并,数据框1优先,数据框2填充空白

merge these by Date with dataframe 1 taking precedence but dataframe 2 filling blanks

DataframeMerge

DataframeMerge

Date      Col1    Col2    Col3
jan         2       1      10
feb         4       2      20
march       6       3      30
april       8       6      40

编辑-解决方案

commonNames <- names(df1)[which(colnames(df1) %in% colnames(df2))]
commonNames <- commonNames[commonNames != "key"]
dfmerge<- merge(df1,df2,by="key",all=T)
for(i in commonNames){
  left <- paste(i, ".x", sep="")
  right <- paste(i, ".y", sep="")
  dfmerge[is.na(dfmerge[left]),left] <- dfmerge[is.na(dfmerge[left]),right]
  dfmerge[right]<- NULL
  colnames(dfmerge)[colnames(dfmerge) == left] <- i
}

推荐答案

merdat <- merge(dfrm1,dfrm2, by="Date")  # seems self-documenting

#  explanation for next line in text below.
merdat$Col2.y[ is.na(merdat$Col2.y) ] <- merdat$Col2.x[ is.na(merdat$Col2.y) ]

然后只需将'merdat $ Col2.y'重命名为'merdat $ Col2'并删除'merdat $ Col2.x'.

Then just rename 'merdat$Col2.y' to 'merdat$Col2' and drop 'merdat$Col2.x'.

作为对更多评论的要求的回复:仅更新向量部分的一种方法是构造一个逻辑向量以进行索引,并使用"["将其应用于赋值的两面.另一种方法是设计一个逻辑矢量,该逻辑矢量仅位于分配的LHS上,然后使用与sum(logical.vector)相同长度的rep()来创建矢量.目标是两个实例都具有与要替换的物品相同的长度(和顺序).

In reply to request for more comments: One way to update only sections of a vector is to construct a logical vector for indexing and apply it using "[" to both sides of an assignment. Another way is to devise a logical vector that is only on the LHS of an assignment but then make a vector using rep() that has the same length as sum(logical.vector). The goal is both instances is to have the same length (and order) for assignment as the items being replaced.

这篇关于合并数据帧并覆盖值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆