2017-03-08 7 views
0

Ich wollte, die von irgendeiner Spalte und Untergruppe, ein mehrspaltigen Datenrahmen, aber der Befehl, um zu bestellen nichtReihenfolge und Teilmenge eines mehrspaltigen Datenrahmens in R?

print(df[order(df$x) & df$x < 5,]) 

bestellt Dies ist nicht das Ergebnis nicht funktionierte.

Um dies zu debuggen ich einen Test Datenrahmen mit 1 Spalte erzeugt, aber diese ‚Vereinfachung‘ hatte unerwartete Auswirkungen

df <- data.frame(x = sample(1:50)) 

print(df[order(df$x) & df$x < 5,]) 

Dies ist nicht das Ergebnis der Reihenfolge so fühlte ich das Problem reproduziert hatte, aber mit einfachen Daten.

Brechen der Prozess zum ersten Bestellung nach unten und dann führte subsetting mir die Ordnung in diesem Fall zu entdecken, erzeugt keine Datenrahmen Objekt

df <- data.frame(x = sample(1:50)) 
ndf <- df[order(df$x),] 
print(class(ndf)) 

produziert

[1] "integer" 

Der Versuch, die resultierende "der Teilmenge Ganzzahl "ndf-Objekt mit Datenframesyntax z

print(ndf[ndf$x < 5, ]) 

erzeugt offensichtlich einen Fehler:

Error in ndf$x : $ operator is invalid for atomic vectors. 

Vereinfachen noch weiter, fand ich subsetting allein (nicht die Reihenfolge Funktion Anwendung) erzeugen keine Datenrahmen Objekt

ndf <- df[df$x < 5,] 

class(ndf) 
[1] "integer" 

Es stellt sich heraus Für den mehrspaltigen Datenrahmen funktioniert die Trennung der Reihenfolge und der Teilmenge wie erwartet

und dies löste mein ursprüngliches Problem, sondern führte zu zwei weiteren Fragen:

  1. Warum ist der Typ des Objekts zurückgegeben, wie oben auf der Grundlage des 1 Spalte Datenrahmen Testfall beschrieben, keinen Datenrahmen? (Ich schätze, ein 1-Spalten-Datenframe enthält nur einen einzelnen Vektor, aber es ist immer noch in einem Datenrahmen verpackt?)
  2. Ist es möglich, einen mehrspaltigen Datenrahmen in 1 Schritt zu bestellen und zu unterteilen?
+2

data.frames in R vereinfacht automatisch an Vektoren durchgeführt werden, wenn nur eine Spalte auswählen: http://stackoverflow.com/questions/21025609/how-do-i-extract-a- Single-Column-from-a-Datenframe-as-a-Data-Frame (dies kann mit 'drop = FALSE' verhindert werden). Subsetting und Bestellung sind zwei verschiedene Operationen. Sie sollten sie in zwei logischen Schritten (aber möglicherweise eine Zeile Code) tun. – MrFlick

Antwort

2

Ein data.frame in R vereinfacht automatisch die Vektoren, wenn nur eine Spalte ausgewählt wird. Dies ist eine übliche und nützliche Vereinfachung und wird besser in this question beschrieben. Natürlich können Sie das mit drop=FALSE verhindern.

Subsetting und Bestellung sind zwei verschiedene Operationen. Sie sollten sie in zwei logischen Schritten (aber möglicherweise eine Zeile Code) tun. Diese Linie ist nicht sehr viel Sinn machen

df[order(df$x) & df$x < 5,] 

Subsetting in R kann entweder mit einem Vektor von Zeilenindizes durchgeführt werden (die order() Returns) oder Boolesche Werte (die die < Vergleich Returns). Mischen sie (mit nur einer &) macht es nicht klar, wie R sollte die Teilmenge durchführen.Aber man kann das brechen in zwei Schritten mit subset()

subset(df[order(df$x),], x < 5) 

Dies macht die Bestellung zuerst und dann die subsetting. Beachten Sie, dass die Bedingung nicht mehr Verzeichnis den Wert df spezifisch referenziert, es wird die Daten aus dem neu geordneten data.frame filtern.

Operationen wie dies ist einer der Gründe, warum viele Menschen die dplyr Bibliothek für Datenmanipulationen bevorzugen. Zum Beispiel kann dies mit

library(dplyr) 
dd <- data.frame(x = sample(1:50)) 
dd %>% filter(x<5) %>% arrange(x) 
Verwandte Themen