2014-11-22 119 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