如何连接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
则不适用。