R排序数据子集

Tom*_*mmy 6 sorting r subset dataframe

我正在学习使用R(版本3.1.2),所以这可能是一个noob问题,但我在订购数据框的子集时遇到了问题.如果我使用mtcars数据框attach(mtcars),我可以轻松地使用它ord.cars <- mtcars[order(hp),].问题是,如果我使用子集,让我们说sub.cars <- subset(mtcars, hp > 120)并尝试使用它ord.sub <- sub.cars[order(mpg),],结果如下:

                     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
Run Code Online (Sandbox Code Playgroud)

为什么R将所有遗留在子集中的行作为NA?

提前致谢!

tal*_*lat 7

这是一个与您attach()在R中不推荐使用相关的问题- 正是出于这个原因!问题是,你的代码有点含糊不清,或者至少,它与你预期的不同.

怎么解决这个?

  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
Run Code Online (Sandbox Code Playgroud)

究竟是什么原因导致代码中的问题?

在您attached输入mtcars数据之后,每当您调用其中一个附加数据的列名称时mpg,它就会引用附加的数据集(原始的mtcats数据).然后问题是您对数据进行了子集化并将其存储在一个新对象(sub.cars)中,而该对象在mtcars仍然附加时未附加.然后,当您尝试订购sub.cars数据时,您使用sub.cars[order(mpg),]并且如您所见,在那里,您引用mpg列 - 由R解释为附加(原始)mtcars数据集中的列,具有更多行比你的子集化数据.subkaars中被子集排除的所有行现在将显示为NAs sub.cars.

经验教训:不要使用attach().