2012-08-23 11 views
6

Ich versuche, Datenrahmen zu filtern, die nur eine Spalte haben. Dies führt zu einem Vektor wie so zurückgegeben werden:Filtern von einspaltigen Datenrahmen

single.c <- data.frame(col1=c(1,2,3,4,5), row.names=C("r1","r2","r3","r4","r5")) 
single.c[single.c$col1 > 2,] 

[1] 3 4 5 

Was will ich eigentlich sind die Daten, wie es zurückgegeben wird, ist für mehrspaltige Datenrahmen:

multi.c <- data.frame(col1=c(1,2,3,4,5), col2=c(1,2,3,4,5), row.names=c("r1","r2","r3","r4","r5")) 
multi.c[multi.c$col2 > 2,] 

    col1 col2 
r3 3 3 
r4 4 4 
r5 5 5 

ich es sehen kann, macht Sinn eine Rückkehr Vektor, wenn es keine anderen Spalten gibt, aber im Allgemeinen möchte ich sehen, welche Zeilen dieses Ergebnis auch gegeben haben. Warum passiert das und gibt es eine einfache Möglichkeit, die Datenrahmenform im Ergebnis zu halten, einschließlich der rownames?

Antwort

10

Verwenden Sie das drop Argument an die Auswahlfunktionen:

single.c[single.c$col1 > 2, ,drop=F] 

# col1 
#r3 3 
#r4 4 
#r5 5 

Von Dokumentation für [:

Tropfen

Für Matrizen und Arrays. Wenn TRUE, wird das Ergebnis auf die niedrigste mögliche Dimension gezwungen (siehe Beispiele). Dies funktioniert nur zum Extrahieren Elemente, nicht für den Ersatz. Siehe Drop für weitere Details.

+3

Danke, ich hatte keine Ahnung, dass die Dokumentation unter '? '[''! – MattLBeck

+2

Tolles Zeug! Ich habe mich immer gefragt, wie man einen data.frame durch Extrahieren einer einzelnen Spalte aus einem vorhandenen data.frame erhält! Ich habe data.frame (col1 = multi.col $ col1, row.names = rohnames (multi.col)) verwendet, um das Gleiche zu tun! Do! –

Verwandte Themen