У меня есть два тиббла с уникальными значениями неравной длины, например:
df1 <- structure(list(col1 = c("A", "T", "C", "D", "X", "F")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))
df2 <- structure(list(col2 = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L))
> df1
# A tibble: 6 × 1
col1
<chr>
1 A
2 T
3 C
4 D
5 X
6 F
> df2
# A tibble: 9 × 1
col2
<chr>
1 A
2 B
3 C
4 D
5 F
6 G
7 H
8 I
9 J
Я хотел бы получить:
> df3
# A tibble: 11 × 2
col1 col2
<chr> <chr>
1 A A
2 NA B
3 T NA
4 C C
5 D D
6 X NA
7 F F
8 NA G
9 NA H
10 NA I
11 NA J
Каждая идентичная строка в столбце 1 в df1 и столбце 2 в df2 должна находиться в одной строке рядом. Например, если строки в столбцах col1 и col2 одинаковы, они должны находиться в одной строке (например, строка A). Если строка существует в столбце 1, но не существует в столбце 2, в столбце 2 она должна быть NA, и наоборот.
Буду благодарен за любые дальнейшие советы.
library(dplyr)
full_join(df1, df2, by = join_by(col1 == col2), keep = TRUE)
#> # A tibble: 12 × 2
#> col1 col2
#> <chr> <chr>
#> 1 A A
#> 2 T <NA>
#> 3 C C
#> 4 D D
#> 5 X <NA>
#> 6 F F
#> 7 <NA> B
#> 8 <NA> E
#> 9 <NA> G
#> 10 <NA> H
#> 11 <NA> I
#> 12 <NA> J
Идеальный. Большое спасибо. Я просто забыл аргумент Keep!
Базовое решение R
lst <- c(df1, df2)
v <- unique(unlist(lst))
list2DF(lapply(lst, \(x) x[match(v, x)]))
дает
col1 col2
1 A A
2 T <NA>
3 C C
4 D D
5 X <NA>
6 F F
7 <NA> B
8 <NA> E
9 <NA> G
10 <NA> H
11 <NA> I
12 <NA> J
Базовое решение с использованием merge
: добавление нового столбца для объединения и его последующее удаление.
merge(cbind(x=df1[[1]], df1), cbind(x=df2[[1]], df2), all=TRUE)[-1]
# col1 col2
#1 A A
#2 <NA> B
#3 C C
#4 D D
#5 <NA> E
#6 F F
#7 <NA> G
#8 <NA> H
#9 <NA> I
#10 <NA> J
#11 T <NA>
#12 X <NA>
Имеет ли значение порядок строк?