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?
提前致谢!
这是一个与您attach()在R中不推荐使用相关的问题- 正是出于这个原因!问题是,你的代码有点含糊不清,或者至少,它与你预期的不同.
怎么解决这个?
detach 数据集和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().
| 归档时间: |
|
| 查看次数: |
2076 次 |
| 最近记录: |