从不同的data.frame添加缺少的列填充为0

时间:2019-03-06 13:32:51

标签: r dataframe dplyr

我有以下情况:

df1
a b c d
1 2 3 4

df2
a c
5 6

我想要的结果是,用df1中缺少的列填充第二个data.frame并将它们填充为零。所以结果应该是:

df3
a b c d
5 0 6 0

数据框架很大,这就是为什么自动执行此方法会让人发呆的原因。

3 个答案:

答案 0 :(得分:3)

我们可以使用setdiff来找出df2中不存在的列,并将值0分配给这些列。

df2[setdiff(names(df1), names(df2))] <- 0

#  a c b d
#1 5 6 0 0

如果我们想保持与df1中相同的列顺序,我们以后可以做

df2[names(df1)]
#  a b c d
#1 5 0 6 0

答案 1 :(得分:1)

也许有一个更优雅的解决方案,但是我认为这适合您的情况。 如果您不太担心将工作流程与dplyrdata.table语法混合在一起,则可以使用setdiff()来标识不匹配的列名,并使用data.table语法无需使用循环或apply()函数即可有效地创建那些零值列。一旦确定适用于所有可能的情况,就可以将其包装在函数中,并在更多数据集中进行缩放。

df1 <- data.frame(a = 1, b = 2, c = 3, d = 4)
df2 <- data.frame(a = 5, c = 6)

# Variables in df1 but not in df2
diff_vars <- dplyr::setdiff(names(df1),names(df2))

df2 %>%
  data.table::data.table() %>%
  .[,c(diff_vars):=0] %>%
  tibble::as_tibble() # Can choose to keep this in data.table 

答案 2 :(得分:0)

df1 <- data.frame(a = 1, b = 2, c = 3, d = 4)

df2 <- data.frame(a = 5, c = 6)

library(tidyverse)

right_join(df1, df2)

 a  b c  d
1 5 NA 6 NA

您必须将NA更改为0。