Igualar marcos de datos excluyendo el último valor que no sea de NA y sin tener en cuenta

Tengo dos marcos de datos:

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

Este es un análisis de la cesta de la compra. df1 es el cliente / socio que compró cada uno de los artículos enumerados: A, B, C ... etc.

df2 son las recomendaciones asociadas con los artículos comprados en el pasado.

El último valor en cada una de las filas df2 representa la recomendación. Por lo tanto, los valores anteriores en cada fila del último valor que no es NA son las "cestas".

Entonces, por ejemplo, en la primera fila de df2, indica: Si B y A se compran juntos, recomiende G.

Quiero poder determinar si cada socio de df1 compró TODOS los valores en cada fila, excluyendo el valor final, ya que esa es la recomendación. Luego agregue esa recomendación al final de cada fila del nuevo marco de datos.

Por ejemplo: Para el socio: Alpha, ¿sería bueno recomendar el valor G de la primera fila? La respuesta sería sí porque compraron todos los valores de esa fila en df2 (A y B).

Para partner: Beta, no sería bueno recomendar el valor G porque no todos los valores de la primera fila de df2 se encuentran en la fila Beta.

Salida final:

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

Resultados escritos para mayor claridad:

df3

la fila1 muestra "No" porque G no se encuentra en Alpha Partner y todos los valores antes de que G aparezca en Alpha Partner (B, A)

row2 genera "Sí" porque D se encuentra en Alpha Partner y todos los valores antes de que D aparezca en Alpha Partner (B, A)

la fila 3 muestra "Sí" porque D se encuentra en Alpha Partner y todos los valores antes de que D aparezca en Alpha Partner (A, B, C)

row4 genera "No" porque M no se encuentra en Alpha Partner y todos los valores antes de M aparecen en Alpha Partner (C, A)

row5 genera "No" porque E no se encuentra en Zeta Partner y todos los valores anteriores a E aparecen en Zeta Partner (K, M)

la fila 6 muestra "No" porque T no se encuentra en Zeta Partner y todos los valores anteriores a T aparecen en Zeta Partner (M)

row7 genera "Sí" porque M se encuentra en Zeta Partner y todos los valores antes de M aparecen en Zeta Partner (K)

Creo que tiene que ser una combinación o una combinación de algún tipo, pero no puedo entender cómo hacerlo.

Esto sería extremadamente útil si alguien me puede ayudar con esto.

Gracias.

Este fue el intento:

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])

Pero esto no funcionó porque no tuvo en cuenta todos los valores, solo si uno de ellos coincidía ... no todos.

Respuestas a la pregunta(1)

Su respuesta a la pregunta