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

例如:

数据帧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填充空白

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
}

===============>>#1 票数:13 已采纳

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'。

在回复请求更多注释时:仅更新向量的各个部分的一种方法是构造用于索引的逻辑向量,并使用“[”将其应用于赋值的两侧。 另一种方法是设计一个仅在赋值的LHS上的逻辑向量,然后使用与sum(logical.vector)具有相同长度的rep()来生成向量。 目标是两个实例都具有与被替换项目相同的长度(和顺序)。

===============>>#2 票数:10

使用data.table的on= argument(允许adhoc连接)使用v1.9.6进行更新:

setDT(df1)[df2, `:=`(Col2 = ifelse(is.na(Col2), i.Col2, Col2), 
                     Col3 = i.Col3), on="Date"][]

这是一个data.table解决方案。 确保您的df1df2Date列是具有所需级别的因子(用于订购)

require(data.table)
dt1 <- data.table(df1, key="Date")
dt2 <- data.table(df2, key="Date")
# Col2 refers to the Col2 of dt1 and i.col2 refers to that of dt2
dt1[dt2, `:=`(Col3 = Col3, Col1 = Col1, 
        Col2 = ifelse(is.na(Col2), i.Col2, Col2))]

# the result is stored in dt1
> dt1
#     Date Col1 Col2 Col3
# 1:   jan    2    1   10
# 2:   feb    4    2   20
# 3: march    6    3   30
# 4: april    8    6   40

===============>>#3 票数:6

这是一个dplyr解决方案。 感谢@docendo discimus

df1 <- data.frame(y = c("A", "B", "C", "D"), x1 = c(1,2,NA, 4)) 

  y x1
1 A  1
2 B  2
3 C NA
4 D  4

df2 <- data.frame(y = c("A", "B", "C"), x1 = c(5, 6, 7))

  y x1
1 A  5
2 B  6
3 C  7

dplyr

left_join(df1, df2, by="y") %>% 
transmute(y, x1 = ifelse(is.na(x1.y), x1.x, x1.y))

  y x1
1 A  5
2 B  6
3 C  7

===============>>#4 票数:5

考虑这个例子:

> d1 <- data.frame(x=1:4, a=2:5, b=c(3,4,5,NA))
> d1
  x a  b
1 1 2  3
2 2 3  4
3 3 4  5
4 4 5 NA
> d2 <- data.frame(x=1:4, b=c(6,7,8,9), c=11:14)
> d2
  x b  c
1 1 6 11
2 2 7 12
3 3 8 13
4 4 9 14

现在使用mergewithinifelse

> within(merge(d1, d2, by="x"), {b <- ifelse(is.na(b.x),b.y,b.x); b.x <- NULL; b.y <- NULL})
  x a  c b
1 1 2 11 3
2 2 3 12 4
3 3 4 13 5
4 4 5 14 9

  ask by EvilWeebl translate from so

未解决问题?本站智能推荐:

2回复

合并数据框值

我想合并由重叠但独立的tsv文件制成的2个数据帧。 FileA是主列表,而FileB包含主列表的一部分,但具有许多更新的校对字段。 目标是更新文件A中文件B不同的字段。 样本数据: 输出应将55532的“ blaackk”更正为“ black”,但应保留“ oops”,因为它不在f
2回复

比较两个数据框的值并合并

我正在使用R中的两个数据框: 现在我要检查df1的每一行: df2中的“位置”与“位置”之间是否存在匹配项 如果'start'值在df2的起始和终止范围内,或者'end'值在df2的起始和终止范围内,则应将df2的相应'out'值粘贴到新列中在df1中 在此示例
2回复

合并不同大小的数据框和重复值

我需要合并两个不同大小的数据帧。 较大的一个( df1 )有一个具有多个重复值( licto )的列,较短的一个( df2 )具有列licto ,但其值不会重复。 df2也有一个ID列。 我需要在df1使用df2的ID的新列,根据licto的重复值重复。 下面的例子可能会让它更清晰。
3回复

根据R中行中的值合并数据框

我有5个数据框,每个数据框具有不同的行数。 我需要根据每个数据帧的col1中的值将它们全部合并在一起。 观察 但是我需要它来产生: 我试图一次by='col1'合并一些,但是没有运气。 有小费吗? 我试过的
1回复

为什么不能在合并的数据框中替换值?

我有两个dataframes ,如下所示: 我合并了df1和df2 : interactions <- merge(df1, df2) ,然后尝试将每个Source和Target与df3进行match 。 我得到以下输出: 所以我想用df2显示的“原始”输入repl
1回复

合并数据框:将值分配给多行

我是R的新手,正在尝试合并两个数据帧df1和df2。 df1看起来像 df2看起来像 我想通过“ user_id”将df1的值分配给df2的所有对应的user_id行来合并这两者。 为了 如何编码?
1回复

合并两个数据框但列值不同

抱歉,我是R的新手,非常感谢您的帮助。 我试图基于时间合并以下两个数据帧(劳动生产率和压抑帧): 和 由于它们的时间值不同,因此我不知道如何合并它们。 理想的情况是:
1回复

根据两个数据框的共享值合并

这个问题已经在这里有了答案: 从df中提取具有两列的重叠行对 2个答案 我有两个数据框。 第一个是这样的: 第二个如下: 我想将它们合并,以使最终结果像这样: 我的意思是,如果df2的前两列的值在df1的前两列中,那么我想将它们合并以获得上
3回复

合并数据框中具有不同值的多行

我是R的新手,我想知道如何为大多数列合并具有相同列值的多行。 例如:我有一个数据集为: 现在,我希望看到的结果是: 我希望将NA原样合并,并将不同的字段转换为NA。
2回复

合并多个数据帧的列,根据列名覆盖值

我有以下数据: 和 我希望以这种方式合并它们,同名的列被覆盖,优先于非NA值。 此外,应添加不常见的列。 期望的结果: 我的数据中的非NA值之间没有冲突。