2014-11-22 188 views
6

我正在學習使用R(版本3.1.2),所以這可能是一個noob問題,但我有問題訂購數據框的一個子集。如果我使用使用attach(mtcars)的mtcars數據幀,我可以使用ord.cars <- mtcars[order(hp),]輕鬆訂購它。問題是,如果我使用的一個子集,讓我們說sub.cars <- subset(mtcars, hp > 120)並嘗試使用ord.sub <- sub.cars[order(mpg),]命令,結果如下: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 

爲什麼[R放回爲來港的留在外面的是,所有的行子集?

在此先感謝!

+2

我猜這是關係到你使用的'附加()'未在R.建議嘗試以下問題:分離的數據集,然後使用'['和/或'$'如果你喜歡用'()'來分析你的數據:'detach(mtcars); ord.cars < - mtcars [order(mtcars $ hp),]; sub.cars < - subset(mtcars,hp> 120); ord.sub < - sub.cars [order(sub.cars $ mpg),]'。這是否按預期工作? – 2014-11-22 16:01:44

+0

@beginneR請將其發佈爲答案。 – Thomas 2014-11-22 16:10:23

+0

收到,@Thomas :) – 2014-11-22 16:11:51

回答

7

這是不是R中建議與您使用的attach()一個問題 - 正是這種原因!問題是,你的代碼有點不明確,或者至少,它與你期望的不一樣。

如何解決這個問題?

  1. detach數據集和
  2. 不要再使用attach。相反,使用[和/或$,如果你喜歡with()子集你的數據。

這裏是你如何能爲例子做:

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 

究竟在你的代碼問題造成的?

後您attached的mtcars數據,只要您撥打附加數據的列名的一個,像mpg,它會參考附件數據集(原mtcats數據)。然後問題在於你對數據進行了子集化並將其存儲在一個新的對象(sub.cars)中,該對象在mtcars仍然連接時未附加。然後,當您嘗試訂購sub.cars數據時,您使用了sub.cars[order(mpg),],正如您所看到的那樣,在那裏,您指的是mpg列 - 它被R解釋爲附加(原始)mtcars數據集中的一個,與比您的子集數據更多的行。子集中排除的所有子行中的所有行現在將在sub.cars中顯示爲NAs。

課程:請勿使用attach()

+0

非常感謝您的時間和耐心! – Tommy 2014-11-24 12:55:59