Финальные соединения
я есть два кадра данных:
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])
Но это не сработало, потому что не учитывали все значения, только если одно из них соответствовало ... не всем.