如何连接2个数据帧,填充R中缺少的行值?

如何连接2个数据帧,填充R中缺少的行值?,r,dataframe,R,Dataframe,我有两个数据帧: df1 ua ub a b c 1 11 12 1 1 0 2 12 13 2 2 2 3 13 14 1 1 1 4 14 15 1 1 1 5 15 16 1 1 1 6 16 17 1 1 1 df2 ua ub a b c d e f 1 11 12 1 1 0 1 1 1 2 14 15 1 1 1 1 1 1 3 16 17 1 1 1 1 1 1 4 12 13 2 2 2 2 2 2 我想连接ua和ub上的两个数据帧,并将df2中的列而不是df1

我有两个数据帧:

df1

  ua ub a b c
1 11 12 1 1 0
2 12 13 2 2 2
3 13 14 1 1 1
4 14 15 1 1 1
5 15 16 1 1 1
6 16 17 1 1 1

df2

  ua ub a b c d e f
1 11 12 1 1 0 1 1 1
2 14 15 1 1 1 1 1 1
3 16 17 1 1 1 1 1 1
4 12 13 2 2 2 2 2 2
我想连接
ua
ub
上的两个数据帧,并将
df2
中的列而不是
df1
添加到
df1
,并用
0
来“填充”缺失的行

这将使:

  ua ub a b c d e f
1 11 12 1 1 0 1 1 1
2 12 13 2 2 2 2 2 2
3 13 14 1 1 1 0 0 0
4 14 15 1 1 1 1 1 1
5 15 16 1 1 1 0 0 0
6 16 17 1 1 1 1 1 1
我可以通过执行以下操作获得
df2
中的列名,而不是
df1
中的列名:

setdiff(names(df2), names(df1))
但是我有点被困在如何合并/合并剩下的结果上

我看了这个q,但没有运气让它为我工作

在Python中,我可以使用
merge
.ffill()
组合,但我不确定如何将其转换为R。我如何才能做到这一点


感谢您的帮助。

一种可能的解决方案是使用
df1
df2
具有共同点的所有列名:

df1 = read.table(text = "
ua ub a b c
1 11 12 1 1 0
2 12 13 2 2 2
3 13 14 1 1 1
4 14 15 1 1 1
5 15 16 1 1 1
6 16 17 1 1 1
", header=T)

df2 = read.table(text = "
  ua ub a b c d e f
1 11 12 1 1 0 1 1 1
2 14 15 1 1 1 1 1 1
3 16 17 1 1 1 1 1 1
4 12 13 2 2 2 2 2 2
", header=T)

library(dplyr)

df1 %>%
  left_join(df2, by=c("ua", "ub", "a", "b", "c")) %>%
  mutate_all(function(x) ifelse(is.na(x), 0, x))

#   ua ub a b c d e f
# 1 11 12 1 1 0 1 1 1
# 2 12 13 2 2 2 2 2 2
# 3 13 14 1 1 1 0 0 0
# 4 14 15 1 1 1 1 1 1
# 5 15 16 1 1 1 0 0 0
# 6 16 17 1 1 1 1 1 1
在不手动指定公共列名称的情况下执行上述操作的另一种方法是

common_names = intersect(names(df1), names(df2))

df1 %>%
  left_join(df2, by=common_names) %>%
  mutate_all(function(x) ifelse(is.na(x), 0, x))
否则,您可以从
df2
中删除您不想加入的任何列,并在最终数据集中保留两次,然后在加入时使用
by=c(“ua”,“ub”)

names_to_use = c("ua", "ub", setdiff(names(df2), names(df1)))
df2_upd = df2[,names_to_use]

df1 %>%
  left_join(df2_upd, by=c("ua", "ub")) %>%
  mutate_all(function(x) ifelse(is.na(x), 0, x))

假设您希望保留
df1
的所有案例,而不是
df2
。可以使用下面的方法

library(dplyr)
df3 <- left_join(df1, df2)
df3[is.na(df3)] <- 0
库(dplyr)

df3您可以使用
dplyr
包中的
full_-join
。然后,您可以用0s?
df3替换NAs。当我在较大的df上尝试此操作时,我在mutate\u impl(.data,dots)中得到了
错误:求值错误:参数2必须是双精度类型,而不是整数。
Hmmm。这是因为变量类型不同和
coalesce
。我将更新我的解决方案。因此,df1中与df2中具有相同名称的列具有不同的类型,即使它们具有相同的名称?更可能的是,不同的列具有不同的类型
mutate\u all
将函数应用于所有列,而
coalesce
取决于列类型,而
ifelse
则不适用。