Não sei ao certo como isso está aqui no tópico, mas você pode facilmente alcançar sua primeira saída desejada combinando os valores na primeira coluna de df2
com |
e, em seguida, usando grep
para encontrar destes na segunda coluna de df1
df1[grep(paste(df2$V1, collapse = "|"), df1$V2), ]
# V1 V2
# 1 apple A,C,D,F
# 2 pear A,D
# 3 plum B,F
# 5 orange B,C,D,H
Para sua segunda saída, um pouco mais de trabalho precisa ser feito. Poderíamos substituir todo o ,
por |
na segunda variável de df1
e, em seguida, procurá-los em df2
enquanto colapsamos em ,
e concatenar de volta para df1
, alguns como os seguintes
res <- sapply(df1$V2, function(x) {
res <- df2$V2[grep(gsub("\,", "|", x), df2$V1)]
if(length(res)) paste(x, paste(res, collapse = ",")) else NA
})
cbind.data.frame(V1 = df1[which(!is.na(res)), 1], V2 = na.omit(res))
# V1 V2
# 1 apple A,C,D,F Jan,Mar,Apr,Jun
# 2 pear A,D Jan,Apr
# 3 plum B,F Feb,Jun
# 4 orange B,C,D,H Feb,Mar,Apr,Aug
Conjuntos de dados conforme os li
df1 <- "banana", "orange", "pear", "plum"), class = "factor"), V2 = structure(c(1L,
2L, 4L, 5L, 3L), .Label = c("A,C,D,F", "A,D", "B,C,D,H", "B,F",
"K,P,Z"), class = "factor")), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA,
-5L))
df2 <- structure(list(V1 = structure(1:10, .Label = c("A", "B", "C",
"D", "E", "F", "G", "H", "I", "J"), class = "factor"), V2 = structure(c(4L,
3L, 7L, 1L, 8L, 6L, 5L, 2L, 10L, 9L), .Label = c("Apr", "Aug",
"Feb", "Jan", "Jul", "Jun", "Mar", "May", "Oct", "Sept"), class = "factor")), .Names = c("V1",
"V2"), class = "data.frame", row.names = c(NA, -10L))