我有两个数据帧:
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
的{{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.我该怎么做?
感谢您的帮助。
答案 0 :(得分:2)
假设您要保留df1
而非df2
的所有案例。可以使用以下
library(dplyr)
df3 <- left_join(df1, df2)
df3[is.na(df3)] <- 0
如果需要df1
以及df2
的所有案例,请在上面的代码中将left_join
替换为full join
答案 1 :(得分:1)
一种可能的解决方案是使用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))