x x1 y z
1 1 10 a 11
2 3 11 b 13
3 5 10 c 15
4 7 11 d 17
5 9 10 e 19
这是dput()
版本:
structure(list(x = c(1, 3, 5, 7, 9), x1 = c(10, 11, 10, 11, 10
), y = structure(1:5, .Label = c("a", "b", "c", "d", "e"), class = "factor"),
z = c(11, 13, 15, 17, 19)), .Names = c("x", "x1", "y", "z"
), row.names = c(NA, -5L), class = "data.frame")
和第二张表(df2):
x x1
1 2 10
2 3 60
dput()
:
structure(list(x = c(2, 3), x1 = c(10, 60)), .Names = c("x",
"x1"), row.names = c(NA, -2L), class = "data.frame")
我现在需要绑定这两个表的行,并用 df1 中的值填充缺少的列值。让我根据这两个表向您解释。
起初,我使用smartbind()
库中的gtools
函数:
library(gtools)
data <- smartbind(df1, df2)
我得到的结果看起来像这样:
x x1 y z
1 10 a 11
3 11 b 13
5 10 c 15
7 11 d 17
9 10 e 19
2 10 <NA> NA
3 60 <NA> NA
所以我想用df1值填充df2行中出现的所有NA值,如果 x相同。在这种情况下,它看起来像这样:
x x1 y z
1 10 a 11
3 11 b 13
5 10 c 15
7 11 d 17
9 10 e 19
2 10 <NA> NA
3 60 b 13
在我的原始数据集中,我确实有大约280列!感谢您的帮助
是否还有其他更优雅的方法,而不是先合并两个数据帧,然后使用rbind()
答案 0 :(得分:5)
首先,您可以合并df1中缺少df2的列,而仅保留多余的列({d1中的y
和z
以及键列x
):
df2 = merge(df2,df1[,c("x","y","z")],by="x",all.x=T)
然后rbind df1和df2:
> rbind(df1,df2)
x x1 y z
1 1 10 a 11
2 3 11 b 13
3 5 10 c 15
4 7 11 d 17
5 9 10 e 19
6 2 10 <NA> NA
7 3 60 b 13
答案 1 :(得分:1)
或使用tidyverse
library(tidyverse)
df1 %>%
select(-x1) %>%
right_join(df2) %>%
bind_rows(df1, .)
# x x1 y z
#1 1 10 a 11
#2 3 11 b 13
#3 5 10 c 15
#4 7 11 d 17
#5 9 10 e 19
#6 2 10 <NA> NA
#7 3 60 b 13
或与data.table
nm1 <- setdiff(names(df1), c('x', 'x1'))
setDT(df2)[df1, (nm1) := mget(nm1), on = .(x)]
rbind(df1, df2)
# x x1 y z
#1: 1 10 a 11
#2: 3 11 b 13
#3: 5 10 c 15
#4: 7 11 d 17
#5: 9 10 e 19
#6: 2 10 <NA> NA
#7: 3 60 b 13