EDIT:
Наиболее эффективный способ предложен в комментарии @Frank:
library(data.table)
df12 <- data.frame(GROUP = c("A1","A2","A3"),
CrossRef = c("W123", "W124", "W125"),
stringsAsFactors=F)
df22 <- data.frame(Key = c(rep("W123", 2), rep("W124",2), rep("W125",2)),
Product = c("y234", "764F","Y654","U341","I65F","O654"),
stringsAsFactors=F)
setDT(df22);
setDT(df12);
df22[, CJ(Key = Key,
Product = Product,
unique=TRUE)][!df22, on=names(df22)][df12, on=.(Key = CrossRef), allow.cart = TRUE]
# Key Product GROUP
# 1: W123 I65F A1
# 2: W123 O654 A1
# 3: W123 U341 A1
# 4: W123 Y654 A1
# 5: W124 764F A2
# 6: W124 I65F A2
# 7: W124 O654 A2
# 8: W124 y234 A2
# 9: W125 764F A3
# 10: W125 U341 A3
# 11: W125 Y654 A3
# 12: W125 y234 A3
OLD:
Для этого конкретного примера простое решение может быть:
# create dataframes
df1 <- data.frame(GROUP = c("A1","A2","A3","A4","A5","A6","B1","B2","B3","B4","B5"),
"CrossRef" = c(rep("W123",6), rep("W124",5)), stringsAsFactors=F)
df2 <- data.frame(Key = c(rep("W123",6), rep("W124",5)),
Product = c("y234", "764F","Y654","U341","I65F","O654",
"342","Y6TR","HR34","QW12","675R"), stringsAsFactors=F)
# Create another dataframe with 2 values of Keys column switched
df3 <- df2
df3$Key <- ifelse(df3$Key == "W123", "W124", "W123")
# merge
merge(df1, df3, by.x ="CrossRef", by.y = "Key", all = TRUE)
# CrossRef GROUP Product
# 1 W123 A1 HR34
# 2 W123 A1 QW12
# 3 W123 A1 342
# 4 W123 A1 Y6TR
# 5 W123 A1 675R
# 6 W123 A2 HR34
# 7 W123 A2 QW12
# 8 W123 A2 342
# 9 W123 A2 Y6TR
# 10 W123 A2 675R
# 11 W123 A3 HR34
# ...
В общем случае (если у вас есть более двух значений значений Cross Ref), это не так просто, но идея аналогична - переставьте ваш второй набор данных.
Вот очень простое решение:
df12 <- data.frame(GROUP = c("A1","A2","A3"),
CrossRef = c("W123", "W124", "W125"),
stringsAsFactors=F)
df22 <- data.frame(Key = c(rep("W123", 2), rep("W124",2), rep("W125",2)),
Product = c("y234", "764F","Y654","U341","I65F","O654"),
stringsAsFactors=F)
library(data.table)
df32 <- list()
i = 1
for (ikey in unique(df22$Key)){
df32[[i]] <-cbind(Key = ikey, Product = df22$Product[df22$Key != ikey])
i <- i+1
}
df32<- rbindlist(lapply(df32, as.data.frame))
merge(df12, df32, by.x ="CrossRef", by.y = "Key", all = TRUE)
# CrossRef GROUP Product
# 1 W123 A1 Y654
# 2 W123 A1 U341
# 3 W123 A1 I65F
# 4 W123 A1 O654
# 5 W124 A2 y234
# 6 W124 A2 764F
# 7 W124 A2 I65F
# 8 W124 A2 O654
# 9 W125 A3 y234
# 10 W125 A3 764F
# 11 W125 A3 Y654
# 12 W125 A3 U341