通过 ID 水平合并两个数据帧并仅保留第二个数据帧的匹配项
Merging two data frames horizontally by ID and keep only matches from the second one
我有两个要水平合并的数据框:
dat_a
a b c
1 1 1 A
2 2 1 A
3 3 1 B
4 4 1 B
dat_b
a b c
1 3 1 C
2 3 1 C
3 3 1 D
4 4 1 D
我只想保留 dat_a
中那些在 dat_b
中与列 a
和 b
.
匹配的行
所以最终结果应该是这样的:
dat_c
a b c
1 3 1 B
2 4 1 B
3 3 1 C
4 3 1 C
5 3 1 D
6 4 1 D
尝试 dplyr
包中的 semi_join
。
如果您只想要在 dat_b
中匹配的行 dat_a
,您可以使用:
library(dplyr)
dat_a %>% semi_join(dat_b, by = c("a", "b"))
如果 - 就像在您想要的输出中一样 - 您想要 dat_a
中的所有列在 dat_b
中匹配,并且 dat_b
中的所有列在 [=14= 中匹配]尝试:
dat_a %>% semi_join(dat_b, by = c("a", "b"))
%>% bind_rows(dat_b %>% semi_joim(dat_a, by = c("a", "b")))
我有两个要水平合并的数据框:
dat_a
a b c
1 1 1 A
2 2 1 A
3 3 1 B
4 4 1 B
dat_b
a b c
1 3 1 C
2 3 1 C
3 3 1 D
4 4 1 D
我只想保留 dat_a
中那些在 dat_b
中与列 a
和 b
.
所以最终结果应该是这样的:
dat_c
a b c
1 3 1 B
2 4 1 B
3 3 1 C
4 3 1 C
5 3 1 D
6 4 1 D
尝试 dplyr
包中的 semi_join
。
如果您只想要在 dat_b
中匹配的行 dat_a
,您可以使用:
library(dplyr)
dat_a %>% semi_join(dat_b, by = c("a", "b"))
如果 - 就像在您想要的输出中一样 - 您想要 dat_a
中的所有列在 dat_b
中匹配,并且 dat_b
中的所有列在 [=14= 中匹配]尝试:
dat_a %>% semi_join(dat_b, by = c("a", "b"))
%>% bind_rows(dat_b %>% semi_joim(dat_a, by = c("a", "b")))