2014-11-22 12 views
6

Uczę się używać R (wersja 3.1.2), więc może to być pytanie typu noob, ale mam problemy z zamawianiem podzbioru ramki danych. Jeśli używam ramki danych mtcars przy użyciu attach(mtcars), mogę łatwo zamówić ją przy użyciu ord.cars <- mtcars[order(hp),]. Problem polega na tym, jeśli mogę użyć podzbioru, powiedzmy sub.cars <- subset(mtcars, hp > 120) i spróbować zamówić za pomocą ord.sub <- sub.cars[order(mpg),], wynik jest następujący:Podzbiór danych R

     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 

Dlaczego R oddanie z powrotem As Nas wszystkie wiersze, które zostały pominięte w podzbiór?

Z góry dziękuję!

+2

Zgaduję, że jest to problem związany z korzystaniem z 'attach()', które nie jest zalecane w R. Spróbuj wykonać następujące czynności: odłącz zestaw danych, a następnie użyj '[' i/lub '$' i lubisz 'with()', aby podzielić twoje dane: 'detach (mtcars); ord.cars <- mtcars [order (mtcars $ hp),]; sub.cars <- podzbiór (mtcars, hp> 120); ord.sub <- sub.cars [order (sub.cars $ mpg),] '. Czy to działa zgodnie z oczekiwaniami? –

+0

@beginneR Proszę zaksięgować to jako odpowiedź. – Thomas

+0

Roger, @Thomas :) –

Odpowiedz

7

Jest to problem związany z używaniem attach(), który nie jest zalecany w R - właśnie z tego powodu! Problem polega na tym, że twój kod jest trochę niejednoznaczny, a przynajmniej jest czymś innym, niż oczekiwałeś.

Jak rozwiązać ten problem?

  1. detach zbiór danych i
  2. nie ponownie użyć attach. Zamiast tego użyj [ i/lub $ i jeśli chcesz with(), aby podsegmentować dane.

Oto jak można to zrobić na przykład:

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 

Co dokładnie spowodowało problem w kodzie?

Po attached dane mtcars, kiedy tylko zadzwonić pod jeden z nazwy kolumn z załączonymi danymi, jak mpg, będzie odnosić się do załączonego zestawu danych (Dane pierwotne mtcats). Problem polegał na tym, że podsegmentowałeś dane i zapisałeś je w nowym obiekcie (sub.cars), który nie był dołączony, podczas gdy mtcars był nadal podłączony. Następnie, gdy próbujesz zamówić dane sub.cars, użyłeś sub.cars[order(mpg),] i jak widzisz, w tym miejscu odwołujesz się do kolumny mpg - interpretowanej przez R jako tę z załączonego (oryginalnego) zestawu danych mtcars, z więcej wierszy niż podsekcji danych. Wszystkie wiersze w Twoich sub.cars, które zostały wykluczone przez podzbiór, będą teraz wyświetlane jako NAs w sub.cars.

Lekcja: nie używaj attach().

+0

Bardzo dziękuję za poświęcony czas i cierpliwość! – Tommy