【发布时间】:2021-12-04 10:51:30
【问题描述】:
【问题讨论】:
-
提供类似问题的参考链接很有帮助,但您的问题不应完全依赖于另一个问题。预计您在 R 中包含数据和尝试解决问题。如果您链接问题中的 OP 决定删除该问题,那么您的问题将变得毫无意义,并且对未来的访问者没有用处。
【问题讨论】:
通过'key'在每个数据中创建一个序列列,然后执行full_join
library(dplyr)
library(data.table)
df1 %>%
mutate(rn = rowid(key)) %>%
full_join(df2 %>%
mutate(rn = rowid(key))) %>%
select(-rn)
-输出
key A B
1 K0 A0 B0
2 K1 A1 B1
3 K2 A2 B2
4 K2 A3 B3
5 K2 A4 <NA>
6 K3 A5 B4
7 K3 <NA> B5
8 K4 <NA> B6
df1 <- structure(list(key = c("K0", "K1", "K2", "K2", "K2", "K3"), A = c("A0",
"A1", "A2", "A3", "A4", "A5")), class = "data.frame",
row.names = c("0",
"1", "2", "3", "4", "5"))
df2 <- structure(list(key = c("K0", "K1", "K2", "K2", "K3", "K3", "K4"
), B = c("B0", "B1", "B2", "B3", "B4", "B5", "B6")),
class = "data.frame", row.names = c("0",
"1", "2", "3", "4", "5", "6"))
【讨论】:
by 列重复,即键。如果存在欺骗,则连接将导致笛卡尔连接。为避免这种情况,我们按“键”row_number 创建一个组。使用data.table,rowid 可以更轻松地完成,无需分两步完成。因此,连接将是 by 'rn' 和 'key' 即现在它是按列/s 唯一的
akrun 的答案太棒了(另见 cmets):我又学到了一些新东西:
大部分都使用rowid{data.table},这是一个用于在每个组中生成唯一行 ID 的便捷函数。
仅dplyr 的解决方案需要两个步骤:
library(dplyr)
df1 %>%
group_by(key) %>%
mutate(id = row_number()) %>%
full_join(df2 %>%
group_by(key) %>%
mutate(id=row_number())) %>%
select(-id)
key A B
<chr> <chr> <chr>
1 K0 A0 B0
2 K1 A1 B1
3 K2 A2 B2
4 K2 A3 B3
5 K2 A4 NA
6 K3 A5 B4
7 K3 NA B5
8 K4 NA B6
【讨论】: