R- Вернуть несоответствующий товар в Merge - PullRequest
0 голосов
/ 09 мая 2018

У меня есть два CSV-файла с большими данными. Я знаю, что нужно объединить два CSV, когда данные совпадают, здесь я пытаюсь объединить, но в своем выходном столбце я пытаюсь получить все продукты, для которых Cross Ref и ключ не совпадают.

Файл 1

GROUP   Cross Ref
A1        W123
A2        W123
A3        W123
A4        W123
A5        W123
A6        W123
B1        W124
B2        W124
B3       W124
B4       W124
B5       W124

file 2
Key     Product
W123    y234
W123    764F
W123    Y654
W123    U341
W123    I65F
W123    O654
W124    342
W124    Y6TR
W124    HR34
W124    QW12
W124    675R

Требуется вывод:

Cross Ref   GROUP   Product
W123         A1      342
W123         A1      Y6TR
W123         A1       HR34
W123         A1      QW12
W123         A1      675R
W123         A2      342
W123         A2     Y6TR
W123         A2     HR34
W123         A2     QW12
W123         A2     675R
W123         A3     342
W123         A3     Y6TR
W123         A3     HR34
W123         A3     QW12
W123         A3     675R

Я пытался

merge(file1,file2,by.x = "Cross.Ref",by.y = "key",all=T)

Это дает мне продукты, где оба ключа совпадают, но мне нужен другой, как показано в выходном файле.

1 Ответ

0 голосов
/ 09 мая 2018

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...