2009-10-08 8 views
20

J'ai une table agrégée:Comment sélectionner des lignes de data.frame avec 2 conditions

> aggdata[1:4,] 
    Group.1 Group.2   x 
1  4 0.05 0.9214660 
2  6 0.05 0.9315789 
3  8 0.05 0.9526316 
4  10 0.05 0.9684211 

Comment puis-je sélectionner la valeur de x quand j'ai des valeurs pour Group.1 et groupe2?

J'ai essayé:

aggdata[aggdata[,"Group.1"]==l && aggdata[,"Group.2"]==lamda,"x"] 

mais que les réponses tous des x.

Plus d'info: Je veux utiliser comme ceci:

table = data.frame(); 
for(l in unique(aggdata[,"Group.1"])) { 
    for(lambda in unique(aggdata[,"Group.2"])) { 
     table[l,lambda] = aggdata[aggdata[,"Group.1"]==l & aggdata[,"Group.2"]==lambda,"x"] 
    } 
} 

Toutes les suggestions qui sont encore plus facile et de donner ce résultat, je vous remercie!

Répondre

13

Utilisez & et non & &. Ce dernier n'évalue que le premier élément de chaque vecteur.

Mise à jour: Pour répondre à la deuxième partie, utilisez le package reshape. Quelque chose comme ceci va le faire:

tablex <- recast(aggdata, Group.1 ~ variable * Group.2, id.var=1:2) 
# Now add useful column and row names 
colnames(tablex) <- gsub("x_","",colnames(tablex)) 
rownames(tablex) <- tablex[,1] 
# Finally remove the redundant first column 
tablex <- tablex[,-1] 

Quelqu'un avec plus d'expérience en utilisant remodeler peut avoir une solution plus simple.

Remarque: N'utilisez pas table comme nom de variable car elle est en conflit avec la fonction table().

+0

Merci! Il semble en effet sélectionner 1 élément. Maintenant, cependant, ma boucle donne l'erreur: "Erreur dans x [[jj]] <- vjj [FALSE]: essayer de sélectionner moins d'un élément" Est-ce encore incorrect? –

+0

Cette erreur est générée car vous utilisez la table [l, lambda] lorsque lambda est inférieur à un. –

+0

Je n'arrive pas à comprendre ce que vous essayez de faire car les éléments du groupe ne sont pas uniques. –

20

La solution la plus simple consiste à remplacer "& &" par "&" dans votre code.

> aggdata[aggdata[,"Group.1"]==6 & aggdata[,"Group.2"]==0.05,"x"] 
[1] 0.9315789 

Ma solution préférée serait d'utiliser sous-ensemble():

> subset(aggdata, Group.1==6 & Group.2==0.05)$x 
[1] 0.9315789 
+1

Pourquoi préféreriez-vous le sous-ensemble? Juste parce que c'est un peu plus propre? – naught101

7

Il y a un document très utile sur sous-ensembles de trames de données R à: http://www.ats.ucla.edu/stat/r/modules/subsetting.htm

Voici l'extrait pertinent:

Subsetting rows using multiple conditional statements: There is no limit to how many logical statements may be combined to achieve the subsetting that is desired. The data frame x.sub1 contains only the observations for which the values of the variable y is greater than 2 and for which the variable V1 is greater than 0.6.

x.sub1 <- subset(x.df, y > 2 & V1 > 0.6)

+0

Ce lien semble être actuel: http://www.ats.ucla.edu/stat/r/faq/subset_R.htm. Je ne sais pas avec certitude, mais le fragment cité est là. – Marek

Questions connexes