r - 将两个数据框的行(按列名合并)与重复的列名绑定(bind)

标签 r dataframe merge

我想通过列名绑定(bind)两个df的行,如果第二个df中不存在列,首先应该有NA。不幸的是 dplyr::bind_rows列名重复存在问题。你能帮我解决这个问题吗?

到目前为止我做了什么?

首先是一些可重现的数据:

df1 <- data.frame(replicate(6,sample(0:1,10,rep=TRUE)))
df2 <- data.frame(replicate(3,sample(0:1,10,rep=TRUE)))
colnames(df1) <- c('A','A','A','B','C','E')
colnames(df2) <- c('A','B','C')

df1
   A A A B C E
1  0 1 0 1 1 1
2  1 1 1 0 0 0
3  0 0 1 1 0 1
4  0 0 1 0 1 1
5  0 1 0 1 1 0
6  1 0 1 1 1 1
7  0 0 1 1 1 0
8  0 1 0 1 1 0
9  0 1 0 0 1 0
10 1 1 0 1 1 0

df2
   A B C
1  1 1 0
2  0 1 1
3  1 1 0
4  1 0 0
5  0 0 1
6  0 0 1
7  0 1 1
8  0 0 0
9  0 0 1
10 0 1 1

我想得到什么?
   A A A B C E
1  0 1 0 1 1 1
2  1 1 1 0 0 0
3  0 0 1 1 0 1
4  0 0 1 0 1 1
5  0 1 0 1 1 0
6  1 0 1 1 1 1
7  0 0 1 1 1 0
8  0 1 0 1 1 0
9  0 1 0 0 1 0
10 1 1 0 1 1 0
11 1 1 1 1 0 NA
12 0 0 0 1 1 NA
13 1 1 1 1 0 NA
14 1 1 1 0 0 NA
15 0 0 0 0 1 NA
16 0 0 0 0 1 NA
17 0 0 0 1 1 NA
18 0 0 0 0 0 NA
19 0 0 0 0 1 NA
20 0 0 0 1 1 NA

我决定使用 bind_rows来自 dplyr , 但:
result <- bind_rows(mutate_all(df1, as.character), mutate_all(df2, as.character))
Error: Columns `A`, `A` must have unique names
Call `rlang::last_error()` to see a backtrace

提前感谢您的帮助!

最佳答案

使用 rbindlist 的选项来自 data.table

library(data.table)
cols <- names(df1)[names(df1) %in% names(df2)]
out <- setDF(rbindlist(list(df1, setNames(df2[cols], cols)), fill = TRUE))
out
#   A A A B C  E
#1  0 1 0 1 1  0
#2  1 1 1 0 1  0
#3  0 1 1 0 1  0
#4  0 0 1 0 1  0
#5  1 0 0 1 0  1
#6  1 1 1 1 0  1
#7  0 0 0 1 0  0
#8  0 0 0 1 0  0
#9  1 1 0 1 0  0
#10 0 1 0 1 1  0
#11 0 0 0 1 1 NA
#12 1 1 1 1 0 NA
#13 0 0 0 0 1 NA
#14 0 0 0 0 1 NA
#15 0 0 0 0 1 NA
#16 1 1 1 1 1 NA
#17 0 0 0 0 0 NA
#18 1 1 1 1 1 NA
#19 0 0 0 1 0 NA
#20 0 0 0 1 1 NA

部分df2[cols]将导致以下具有唯一名称的数据框
#   A A.1 A.2 B C
#1  0   0   0 1 1
#2  1   1   1 1 0
#3  0   0   0 0 1
# ...

这就是为什么我们调用 setNames(df2[cols], cols)立即重命名列。 setDF确保结果是 data.frame而不是 data.table .

使用 bind_rows你最终只有四列
head(bind_rows(df1, setNames(df2[cols], cols)), 3)
#  A B C E
#1 1 1 0 0
#2 0 0 0 0
#3 0 0 1 1

关于r - 将两个数据框的行(按列名合并)与重复的列名绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54569684/

相关文章:

git - 仅 merge git 分支中的增量更改

r - 编辑数据表,但当我们移动到另一个页面时,更改就会消失

python - 更改 Pandas 数据框中一列中的所有值

r - 在 A 列中查找大于 0 的第一个值的位置,并在 B 列中的该位置返回值

python-2.7 - Python 数据帧在微秒内重新采样

mysql - 无需任何键即可连接两个表

r - 如何在R中的数据框的对角线上提取值?

r - Sublime Text 2 中的自动完成 R

r - 是否有交互式输出设备可以在 R 中查看 3D 图形?

git - git 如何知道要保留一行的哪个版本?