Объедините две таблицы и умножьте комбинации с первого на второе - PullRequest
0 голосов
/ 12 января 2019

Я хотел бы объединить две таблицы на основе условий сопоставления из второй таблицы. Однако для полей, которые не совпадают, я хотел бы дублировать записи из первой таблицы.

Я использую dplyr и попробовал full_join, но это просто объединяет две таблицы и не дублирует несовпадающие строки.

Таблица 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

Таблица 2

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

Таблица 3, т. Е. Комбинации таблицы 1 и таблицы 2 (с дубликатами из таблицы 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

K6, SL, EY комбинация Aero, Asia, US в таблице 2, но не в таблице 1, поэтому я хотел бы продублировать значения в таблице 1 и но с EY, установленным на US

1 Ответ

0 голосов
/ 12 января 2019

Чтобы дублировать таблицу со значениями EY, которых нет в таблице 1, я предлагаю присоединиться к таблице 2 только по столбцам K6 и 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
...