2010-08-10 5 views
12

J'ai deux noms de données. Pour des exemples bien disons qu'ils ressemblent à ceci:Sous-ensemble d'une trame de données basée sur le contenu d'une autre trame de données

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

Ce que je voudrais faire est de sous-ensemble DF1 »pour contenir les lignes dont la valeur correspond à la première colonne une valeur dans la première colonne de « DF2 ».

Maintenant, je l'ai essayé:

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

Mais cela me dit que je dois de taille égale data.frames. Pensées?

Répondre

14

Les deux %in% et match() peuvent être utilisés pour cela. Voici le premier:

> 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 [qui (df1 $ x% en% df2 $ y), "x"] <- merci! –

+2

Vous pouvez supprimer le 'which' comme vous pouvez l'indexer directement avec un vecteur de booléens - donc' df1 [df1 $ x% dans% df2 $ y, "x"] 'est plus court. J'aime 'which()' car je veux parfois juste les indices pour m'assurer que j'obtiens les bons résultats intermédiaires. –

+1

Comment sous-estimeriez-vous df1 supérieur à df2 au lieu de correspondre? – chimpsarehungry