Финальные соединения

я есть два кадра данных:

Partner<-c("Alpha","Beta","Zeta")
COL1<-c("A","C","M")
COL2<-c("B","D","K")
COL3<-c("C","F",NA)
COL4<-c("D",NA,NA)
df1<-data.frame(Partner,COL1,COL2,COL3,COL4)

lift<-c(9,10,11,12,12,23,12,24)
RULE1<-c("B","B","D","A","C","K","M","K")
RULE2<-c("A","A","C","B","A","M","T","M")
RULE3<-c("G","D","M","C" ,"M", "E",NA,NA)
RULE4<-c(NA,NA,"K","D" ,NA, NA,NA,NA)

df2<-data.frame(lift,RULE1,RULE2,RULE3,RULE4)

df1
Partner    COL1    COL2    COL3    COL4
Alpha         A       B       C       D
Beta          C       D       F      NA
Zeta          M       K      NA      NA

df2
lift    RULE1    RULE2     RULE3    RULE4
   9        B        A         G       NA
  10        B        A         D       NA
  11        D        C         M        K
  12        A        B         C        D
  12        C        A         M       NA
  23        K        M         E       NA
  12        M        T        NA       NA
  24        K        M        NA       NA

Это анализ корзины рынка. df1 - это клиент / партнер, который купил каждый из перечисленных предметов: A, B, C ... и т. д.

df2 - это рекомендации, связанные с предметами, купленными в прошлом.

Последнее значение в каждой из строк df2 представляет рекомендацию. Таким образом, предшествующие значения в каждом ряду из последнего значения не-NA являются «корзинами».

Так, например, в первом ряду df2 указывается: если B и A куплены вместе, рекомендуем G.

Я хочу быть в состоянии выяснить, купил ли каждый партнер из df1 ВСЕ значения в каждой строке, исключая окончательное значение, так как это рекомендация. Затем добавьте эту рекомендацию в конец каждой строки нового кадра данных.

Например: Для партнера: Альфа, было бы хорошо рекомендовать значение G из первого ряда? Ответ был бы да, потому что они купили все значения из этой строки в df2 (A и B).

Для партнера: бета не рекомендуется рекомендовать значение G, потому что не все значения из первого ряда df2 находятся в строке бета.

Окончательный результат:

Partner    COL1    COL2    COL3    COL4    lift   RULE1    RULE2    RULE3    RULE4   Does Last Non-NA Value Exist in Row?
Alpha         A       B       C       D       9       B        A        G       NA                                    No
Alpha         A       B       C       D      10       B        A        D       NA                                   Yes
Alpha         A       B       C       D      12       A        B        C        D                                   Yes
Alpha         A       B       C       D      12       C        A        M       NA                                    No
Zeta          M       K      NA      NA      23       K        M        E       NA                                    No
Zeta          M       K      NA      NA      12       M        T       NA       NA                                    No
Zeta          M       K      NA      NA      24       K        M       NA       NA                                   Yes

Выписаны результаты для наглядности:

DF3

В строке 1 выводится «Нет», поскольку G не найден в Alpha Partner, и все значения перед G отображаются в Alpha Partner (B, A)

В строке 2 выводится «Да», поскольку D находится в Alpha Partner, и все значения перед D отображаются в Alpha Partner (B, A)

В строке 3 выводится «Да», так как D находится в Alpha Partner, и все значения перед D отображаются в Alpha Partner (A, B, C).

row4 выводит «Нет», поскольку M не найден в Alpha Partner, и все значения до M отображаются в Alpha Partner (C, A)

row5 выводит «Нет», потому что E не найден в Zeta Partner, и все значения до E отображаются в Zeta Partner (K, M)

В строке 6 выводится «Нет», поскольку T не найден в Zeta Partner, и все значения до T отображаются в Zeta Partner (M)

row7 выдает «Да», потому что M находится в Zeta Partner, и все значения перед M отображаются в Zeta Partner (K)

Я думаю, что это должно быть соединение или матч какого-то рода, но не могу понять, как это сделать.

Это было бы чрезвычайно полезно, если бы кто-то мог помочь мне с этим.

Благодарю.

Это была попытка:

df1<-cbind(df1_id=1:nrow(df1),df1)
df2 <- cbind(df2_id=1:nrow(df2),df2)
d11  <- df1 %>% gather(Col, Value,starts_with("C"))           #Long
d11 <- d11 %>% na.omit() %>%group_by(df1_id) %>% slice(-n()) #remove last non NA
d22  <- df2 %>%  gather(Rule, Value,starts_with("R"))
res <- inner_join(d11,d22)
rm(d22)
rm(d11)
final<-cbind(df1[res$df1_id,],df2[res$df2_id,])
final$Exist <- apply(final, 1, FUN = function(x) 
c("No", "Yes")[(anyDuplicated(x[!is.na(x) & x != "" ])!=0) +1])

Но это не сработало, потому что не учитывали все значения, только если одно из них соответствовало ... не всем.

Ответы на вопрос(1)

Ваш ответ на вопрос