R: subconjunto de linhas de um dataframe contendo uma string em outro arquivo

1

Gostaria de subdividir as linhas do quadro de dados 1 ( df1 ) que contêm uma string de uma coluna no quadro de dados 2 ( df2 ). O problema é que o arquivo1 terá várias cadeias na mesma coluna. Eu tentei várias variações de subconjunto e grep , sem sucesso.
Aqui está um exemplo dos arquivos, e os resultados que eu gostaria de alcançar (ou seria ótimo):

df1

1   apple   A,C,D,F  
2   pear    A,D  
3   plum    B,F  
4   banana  K,P,Z  
5   orange  B,C,D,H  

df2

A   Jan  
B   Feb  
C   Mar  
D   Apr  
E   May  
F   Jun  
G   Jul  
H   Aug  
I   Sept  
J   Oct  

Resultado 1

1   apple   A,C,D,F  
2   pear    A,D  
3   plum    B,F  
5   orange  B,C,D,H  

Resultado 2

1   apple   A,C,D,F Jan,Mar,Apr,Jun  
2   pear    A,D Jan,Apr  
3   plum    B,F Feb,Jun  
5   orange  B,C,D,H Feb,Mar,Apr,Aug  
    
por chris.gene 17.11.2015 / 14:17

1 resposta

0

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))
    
por 07.12.2015 / 20:26