我有以下情况:
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
数据框架很大,这就是为什么自动执行此方法会让人发呆的原因。
答案 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)
也许有一个更优雅的解决方案,但是我认为这适合您的情况。
如果您不太担心将工作流程与dplyr
和data.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。