将数据框与空数据框中的列名合并
Merging a dataframe with column names from an empty dataframe
我有两个 df
(df
、df2
)。
虽然 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
我有两个 df
(df
、df2
)。
虽然 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