R сортировка подмножества данных

Я учусь использовать 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

почему R возвращает в NAs все строки, которые были исключены из подмножества?

спасибо заранее!

1 ответов


это проблема, связанная с использованием 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

что именно вызвало проблему в вашем коде?

после attached данные mtcars, всякий раз, когда вы вызываете одно из имен столбцов вложенных данных, например mpg, он будет ссылаться на прилагаемый набор данных (исходные данные mtcats). Проблема заключалась в том, что вы вложили данные и сохранили их в новом объекте (sub.автомобили), который не был прикреплен, пока mtcars все еще был прикреплен. Потом, когда ты пытался заказать подлодку.данные автомобилей, вы использовали sub.cars[order(mpg),] и, как вы можете видеть, там вы ссылаетесь на mpg столбец-который интерпретируется R как один из прикрепленного (исходного) набора данных mtcars, с большим количеством строк, чем вы подсеттировали данные. Все эти строки в твоей подлодке.автомобили, которые были исключены из подмножества, теперь будут отображаться как NAs в sub.cars.

урок: не используйте attach().