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

时间:2017-12-14 13:45:04

标签: 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

我想加入uaub上的两个数据框,并添加df2中不在df1的{​​{1}}上的列,以及使用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

但是我对如何合并/连接其余结果感到有些困惑。

我看了这个q here,但没有运气让它适合我。

在Pandas Python中,我可以将setdiff(names(df2), names(df1)) merge结合使用,但我不确定如何将其转换为R.我该怎么做?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

假设您要保留df1而非df2的所有案例。可以使用以下

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

如果需要df1以及df2的所有案例,请在上面的代码中将left_join替换为full join

答案 1 :(得分:1)

一种可能的解决方案是使用df1df2共有的所有列名:

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))