2009-10-08 21 views
20

Ho una tabella aggregata:Come selezionare le righe da data.frame con 2 condizioni

> 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 

Come posso selezionare il valore x quando ho valori per gruppo1 e Group.2?

ho provato:

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

ma che risponde tutti i x.

Maggiori informazioni: voglio usare questo come questo:

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"] 
    } 
} 

Tutti i suggerimenti che sono ancora più facile e dare questo risultato apprezzo!

risposta

13

Utilizzare & non & &. Quest'ultimo valuta solo il primo elemento di ciascun vettore.

Aggiornamento: per rispondere alla seconda parte, utilizzare il pacchetto di risagoma. Qualcosa di simile lo farà:

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] 

Qualcuno con più esperienza con la risagoma può avere una soluzione più semplice.

Nota: non utilizzare la tabella come nome di variabile in quanto è in conflitto con la funzione table().

+0

Grazie! Sembra infatti selezionare 1 elemento. Ora però, il mio loop dà l'errore: "Errore in x [[jj]] <- vjj [FALSE]: tenta di selezionare meno di un elemento" E 'ancora errato? –

+0

Questo errore viene generato perché si utilizza la tabella [l, lambda] quando lambda è minore di uno. –

+0

Non riesco a capire cosa stai cercando di fare in quanto gli elementi del gruppo non sono unici. –

20

La soluzione più semplice è cambiare "& &" in "&" nel codice.

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

La mia soluzione preferita sarebbe quella di utilizzare sottoinsieme():

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

Perché preferire sottoinsieme? Solo perché è un po 'più ordinato? – naught101

7

C'è un documento molto utile su sottoinsiemi frame di dati R a: http://www.ats.ucla.edu/stat/r/modules/subsetting.htm

Ecco l'estratto in questione:

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

Questo link sembra essere attuale: http://www.ats.ucla.edu/stat/r/faq/subset_R.htm. Non so per certo ma il frammento citato è lì. – Marek

Problemi correlati