合并数据帧并覆盖值 [英] Merge data frames and overwrite values
问题描述
如何合并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屋!