将数据框与空数据框中的列名合并

Merging a dataframe with column names from an empty dataframe

我有两个 dfdfdf2)。 虽然 df 没有每个列名,但是 df2 有。

df2 然而,是空的:

set.seed(1)
df <- data.frame(
    ID = 1:5,
    DOG = replicate(5, rbinom(1, 1, 0.5)), 
    CAT = replicate(5, rbinom(1, 1, 0.5)),
    FISH = replicate(5, rbinom(1, 1, 0.5)))

df2 <- data.frame(matrix(, nrow=0, ncol=7))
names(df2) <- c("DOG", "CAT", "FISH", "CRANE", "PIG", "SHARK", "DEER")

我想 "combine" 这两个数据帧而不匹配任何东西。我基本上只想 df 包含 df2 中的所有列,但是 NA-ed.

期望的输出:

ID DOG CAT FISH CRANE PIG SHARK DEER
1   0   1    0    NA  NA    NA   NA
2   0   1    0    NA  NA    NA   NA
3   1   1    1    NA  NA    NA   NA  
4   1   1    0    NA  NA    NA   NA
5   0   0    1    NA  NA    NA   NA

我们可以使用bind_rows

library(dplyr)
bind_rows(df2, df)
#  DOG CAT FISH CRANE PIG SHARK DEER
#1   0   1    0    NA  NA    NA   NA
#2   0   1    0    NA  NA    NA   NA
#3   1   1    1    NA  NA    NA   NA
#4   1   1    0    NA  NA    NA   NA
#5   0   0    1    NA  NA    NA   NA

基础包:

merge(df, df2, all = TRUE, sort = FALSE)

输出:

  DOG CAT FISH ID CRANE PIG SHARK DEER
1   0   1    0  1    NA  NA    NA   NA
2   0   1    0  2    NA  NA    NA   NA
3   1   1    1  3    NA  NA    NA   NA
4   1   1    0  4    NA  NA    NA   NA
5   0   0    1  5    NA  NA    NA   NA

保留列的顺序:

merge(df, df2, all =TRUE, sort = FALSE)[, union(names(df), names(df2))]

输出:

  ID DOG CAT FISH CRANE PIG SHARK DEER
1  1   0   1    0    NA  NA    NA   NA
2  2   0   1    0    NA  NA    NA   NA
3  3   1   1    1    NA  NA    NA   NA
4  4   1   1    0    NA  NA    NA   NA
5  5   0   0    1    NA  NA    NA   NA

使用sqldf:

library(sqldf)
sqldf("SELECT * FROM df
      LEFT JOIN df2
      USING(DOG, CAT, FISH)")

输出:

  ID DOG CAT FISH CRANE PIG SHARK DEER
1  1   0   1    0    NA  NA    NA   NA
2  2   0   1    0    NA  NA    NA   NA
3  3   1   1    1    NA  NA    NA   NA
4  4   1   1    0    NA  NA    NA   NA
5  5   0   0    1    NA  NA    NA   NA