合并两个表并将组合从第一个乘以第二个

Combine two tables and multiply combinations from first into second

我想根据第二个 table 的匹配条件合并两个 table。但是,对于不匹配的字段,我想从第一个 table.

复制记录

我正在使用 dplyr 并尝试过 full_join 但这只是结合了两个 table 并且不会复制不匹配的行。

Table 1

K6  K7  SL  EY  Val.1
Aero    Gen Asia    Asia    1
Aero    Arp Asia    Asia    2
Aero    Pro Asia    Asia    8
Aero    Lgt Asia    Asia    6

Table 2

K6  SL  EY  Val.2
Aero    Asia    Asia    15
Aero    Asia    US  20

Table 3 即 Table 1 和 Table 2 的组合(来自 table 1 的重复项,其中 EY 不匹配):

K6  K7  SL  EY  Val.1   Val.2
Aero    Gen Asia    Asia    1   15
Aero    Arp Asia    Asia    2   15
Aero    Pro Asia    Asia    8   15
Aero    Lgt Asia    Asia    6   15
Aero    Gen Asia    US  0   20
Aero    Arp Asia    US  0   20
Aero    Pro Asia    US  0   20
Aero    Lgt Asia    US  0   20

K6SLEY组合AeroAsiaUS中的table2 但是不在 table 1 中,因此我想复制 table 1 中的值,但将 EY 设置为 US

要为 table 1 中不存在的 EY 值复制 table,我建议仅在列 [=13= 上加入 table 2 ] 和 SL,不在列 EY.

table_1 <- data.frame(K6=rep("Aero",4), K7=c("Gen","Arp","Pro","Lgt"), SL=rep("Asia",4), EY=rep("Asia",4), Val.1=c(1,2,8,6), stringsAsFactors = FALSE)
table_2 <- data.frame(K6=rep("Aero",2), SL=rep("Asia",2), EY=c("Asia","US"), Val.2=c(15,20), stringsAsFactors = FALSE)

library(dplyr)
table_3 <- left_join(table_2, table_1, by=c("K6","SL"))

    K6   SL EY.x Val.2  K7 EY.y Val.1
1 Aero Asia Asia    15 Gen Asia     1
2 Aero Asia Asia    15 Arp Asia     2
3 Aero Asia Asia    15 Pro Asia     8
4 Aero Asia Asia    15 Lgt Asia     6
5 Aero Asia   US    20 Gen Asia     1
6 Aero Asia   US    20 Arp Asia     2
7 Aero Asia   US    20 Pro Asia     8
8 Aero Asia   US    20 Lgt Asia     6

然后,对于 EY.x 不匹配 EY.y 的所有行,将 Val.1 设置为 0。

table_3 <- table_3 %>%
  mutate(Val.1 = ifelse(EY.x==EY.y, Val.1, 0)) %>%
  select(-EY.y, EY=EY.x)

    K6   SL   EY Val.2  K7 Val.1
1 Aero Asia Asia    15 Gen     1
2 Aero Asia Asia    15 Arp     2
3 Aero Asia Asia    15 Pro     8
4 Aero Asia Asia    15 Lgt     6
5 Aero Asia   US    20 Gen     0
6 Aero Asia   US    20 Arp     0
7 Aero Asia   US    20 Pro     0
8 Aero Asia   US    20 Lgt     0