如何将数据框中的行合并到另一个数据框中,当它们具有不等数量的列并且仅插入匹配的列时

时间:2017-07-26 10:55:36

标签: r dataframe data-binding

我有两个df,看起来像:

>df1
name   time    date
Dan    01:00    Apr-17
Ann    02:00    Apr-17

>df2
name   time
Joe    03:00
Bob    04:00

>out
name   time
Dan    01:00
Ann    02:00
Joe    03:00

我想将df1中的一行合并到df2而不创建新列。此外,names下的数据是rownames,不应覆盖。我的实际数据帧分别有~800和99列。

我在之前的类似问题中尝试过以下答案,但我无法得到我想要的结果,包括rbind,bind_rows,rbind.fill。这些工作在某种程度上但总是删除我的rownames

rbind.fill(df1, df2[colnames(df2) %in% colnames(df2)])
rbind(df2, df1[1,names(df1)])
bind_rows(df1[1,], df2)

2 个答案:

答案 0 :(得分:1)

你的尝试非常接近。

rbind.fill(df1, df2[colnames(df2) %in% colnames(df2)])

基本上说:将df1绑定到df2,但只接受df2中也在df2中的列。

但这不是你想要做的。尝试:

rbind(df1[colnames(df1) %in% colnames(df2)], df2)

其中说: 将df1绑定到df2,但只接受df1中也在df2中的列。

结果:

  name  time
1  Dan 01:00
2  Ann 02:00
3  Joe 03:00
4  Bob 04:00

或者只添加df2中name=="Joe"

的行
rbind(df1[colnames(df1) %in% colnames(df2)], df2[df2$name=="Joe",])

结果:

  name  time
1  Dan 01:00
2  Ann 02:00
3  Joe 03:00

答案 1 :(得分:0)

以下是使用tidyverse

的选项
library(tidyverse)
bind_rows(df1[-3], df2)
#   name  time
#1  Dan 01:00
#2  Ann 02:00
#3  Joe 03:00
#4  Bob 04:00