2010-08-10 15 views
12

Tengo dos data.frames. Por el amor ejemplos digamos que se ven así:Subconjunto de un marco de datos basado en el contenido de otro marco de datos

df1 <- data.frame(x=rep(letters[1:26], 16)) 
df2 <- data.frame(y=letters[1:4]) 

Lo que me gustaría hacer es subconjunto 'DF1' para contener las filas cuyo valor de la primera columna coincide con cualquier valor dentro de la primera columna de 'gl2'.

Ahora, he intentado:

subset(df1, df1$x == df2$y) 

Pero esto me dice que necesito data.frames de igual tamaño. ¿Pensamientos?

Respuesta

14

Tanto %in% como match() se pueden usar para esto. Aquí está el anterior:

> which(df1$x %in% df2$y) 
[1] 1 2 3 4 27 28 29 30 53 54 55 56 79 80 81 82 105 
[18] 106 107 108 131 132 133 134 157 158 159 160 183 184 185 186 209 210 
[35] 211 212 235 236 237 238 261 262 263 264 287 288 289 290 313 314 315 
[52] 316 339 340 341 342 365 366 367 368 391 392 393 394 
> 
> 
> table(df1[ which(df1$x %in% df2$y), "x"]) 

a b c d e f g h i j k l m n o p q r s t u v w x y 
16 16 16 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
z 
0 
> 
+1

df1 [que (df1 $ x% en% df2 $ y), "x"] <- ¡gracias! –

+2

Puede soltar el 'which' ya que puede indexar directamente con un vector de booleanos, por lo que' df1 [df1 $ x% en% df2 $ y, "x"] 'es más corto. Me gusta 'which()' ya que a veces solo quiero los índices para asegurarme de obtener los resultados intermedios correctos. –

+1

¿Cómo se subconjunto df1 mayor que df2 en lugar de coincidir? – chimpsarehungry

Cuestiones relacionadas