2016-02-10

Seleccionar con sqldf un subconjunto de filas de una columna en un data frame diferente

Title

Problema

Supongamos que tenemos los siguientes data frames.

#A
  a1  a2
1  1 101
2  2 102
3  3 103
4  4 104
#B
  a1  a2
1  1 101
2  2 102
3  3 103
4  4 104
A <-  data.frame(a1 = c(1:4), a2 = c(101:104))
B <-  data.frame(b1 = c(1:2), b2 = c(55,56))
Deseamos obtener el siguiente subconjunto de filas del data frame A, en el que la columna A$a1 contenga los elementos de la columna B%b1 del data frame B. Pero en lugar del paquete base, como hacemos a continuación, queremos emplear el paquete sqldf.

A[A$a1 %in% B$b1, ]

 a1  a2
1  1 101
2  2 102

Solución

Usamos la función paste dos veces. Para concatenar los elementos del vector B$b1 separado por comas, y después para concatenar la cadena de texto deseada: [1] "select * from A where a1 in( 1,2 )"

library(sqldf)
sqldf(paste("select * from A where a1 in(", paste(B$b1, collapse = ","), ")"))
Otras dos alternativas propuestas por G. Grothendieck son:

# 1
fn$sqldf(" select * from A where a1 in ( `toString(B$b1)` ) ") 
# 2
sqldf("select A.* from A join B on A.a1 = B.b1")

Resultado

 a1  a2
1  1 101
2  2 102

Referencias

No hay comentarios:

Publicar un comentario

Nube de datos