2014-11-22 4 views
6

Ich lerne R (Version 3.1.2) zu verwenden, so kann dies als eine Frage kommen, aber ich habe Probleme beim Bestellen einer Teilmenge eines Datenrahmens. Wenn ich den mtcars Datenrahmen unter Verwendung attach(mtcars) benutze, kann ich ihn einfach unter Verwendung ord.cars <- mtcars[order(hp),] bestellen. Das Problem ist, wenn ich eine Teilmenge verwenden, lassen Sie uns sub.cars <- subset(mtcars, hp > 120) sagen und versuchen, es zu bestellen ord.sub <- sub.cars[order(mpg),] verwenden, ist das Ergebnis folgendes:R Sortierdaten Teilmenge

     mpg cyl disp hp drat wt qsec vs am gear carb 
NA     NA NA NA NA NA NA NA NA NA NA NA 
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4 
NA.1     NA NA NA NA NA NA NA NA NA NA NA 
NA.2     NA NA NA NA NA NA NA NA NA NA NA 
NA.3     NA NA NA NA NA NA NA NA NA NA NA 
NA.4     NA NA NA NA NA NA NA NA NA NA NA 
Merc 280   19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4 
NA.5     NA NA NA NA NA NA NA NA NA NA NA 
Merc 450SL   17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3 
NA.6     NA NA NA NA NA NA NA NA NA NA NA 
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 
Duster 360   14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 
Merc 280C   17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4 
NA.7     NA NA NA NA NA NA NA NA NA NA NA 
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4 
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2 
NA.8     NA NA NA NA NA NA NA NA NA NA NA 
NA.9     NA NA NA NA NA NA NA NA NA NA NA 
Merc 450SE   16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3 
NA.10     NA NA NA NA NA NA NA NA NA NA NA 
NA.11     NA NA NA NA NA NA NA NA NA NA NA 
AMC Javelin   15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2 
Camaro Z28   13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4 
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2 
Ford Pantera L  15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4 
Ferrari Dino  19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6 
Maserati Bora  15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8 
Merc 450SLC   15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3 
NA.12     NA NA NA NA NA NA NA NA NA NA NA 
NA.13     NA NA NA NA NA NA NA NA NA NA NA 
NA.14     NA NA NA NA NA NA NA NA NA NA NA 

Warum ist R setzen, wie NAs alle Zeilen zurück, die aus dem gelassen wurden Teilmenge?

Vielen Dank im Voraus!

+2

Ich vermute, das ist ein Problem im Zusammenhang mit Ihrer Verwendung von 'attach()', die nicht in R empfohlen wird. Versuchen Sie Folgendes: Lösen Sie den Datensatz und verwenden Sie dann '' '' '' '' '' Sie mögen 'with()', um Ihre Daten zu unterteilen: 'detach (mtcars); ord.cars <- mtcars [Reihenfolge (mtcars $ hp),]; sub.cars <- Teilmenge (mtcars, hp> 120); ord <- sub.cars [order (sub.cars $ mpg),] '. Funktioniert das wie erwartet? –

+0

@beginneR Bitte posten Sie das als Antwort. – Thomas

+0

Roger that, @Thomas :) –

Antwort

7

Dies ist ein Problem im Zusammenhang mit Ihrer Verwendung von attach(), die nicht in R empfohlen wird - genau aus diesem Grund! Das Problem ist, dass Ihr Code irgendwie mehrdeutig ist, oder zumindest etwas, das anders ist als das, was Sie erwartet haben.

Wie löst man das?

  1. detach der Datensatz und
  2. do attach nicht wieder verwenden. Verwenden Sie stattdessen [ und/oder $, und wenn Sie möchten with(), um Ihre Daten zu unterteilen.

Hier ist, wie man es zum Beispiel tun könnte:

detach(mtcars) 
ord.cars <- mtcars[order(mtcars$hp),] 

sub.cars <- subset(mtcars, hp > 120) 
#the subset could also be written as: 
sub.cars <- mtcars[mtcars$hp > 120,] 

ord.sub <- sub.cars[order(sub.cars$mpg),] 

head(ord.sub) # only show the first 6 rows 
        mpg cyl disp hp drat wt qsec vs am gear carb 
Cadillac Fleetwood 10.4 8 472 205 2.93 5.25 18.0 0 0 3 4 
Lincoln Continental 10.4 8 460 215 3.00 5.42 17.8 0 0 3 4 
Camaro Z28   13.3 8 350 245 3.73 3.84 15.4 0 0 3 4 
Duster 360   14.3 8 360 245 3.21 3.57 15.8 0 0 3 4 
Chrysler Imperial 14.7 8 440 230 3.23 5.34 17.4 0 0 3 4 
Maserati Bora  15.0 8 301 335 3.54 3.57 14.6 0 1 5 8 

Was genau das Problem in Ihrem Code verursacht?

Nach Ihnen attached die mtcars Daten, wenn Sie einen der Spaltennamen der angehängten Daten aufrufen, wie mpg, wird es auf den beigefügten Datensatz verweisen (die ursprünglichen mtcats Daten). Das Problem bestand dann darin, dass Sie die Daten in Teilmengen unterteilten und in einem neuen Objekt (sub.cars) speichern, das nicht angehängt wurde, während mtcars noch angehängt war. Dann, als Sie versuchten, die sub.cars Daten zu bestellen, verwendeten Sie sub.cars[order(mpg),] und wie Sie sehen können, beziehen Sie sich dort auf mpg Spalte - die von R wie der aus dem beigefügten (ursprünglichen) mtcars Datensatz interpretiert wird, mit mehr Zeilen als Sie unterteilte Daten. Alle Zeilen in Ihren sub.cars, die durch die Teilmenge ausgeschlossen wurden, werden nun in sub.cars als NAs angezeigt.

Lektion: nicht attach() verwenden.

+0

Vielen Dank für Ihre Zeit und Geduld! – Tommy

Verwandte Themen