2014-11-22 21 views
6

Tôi đang học cách sử dụng R (phiên bản 3.1.2), vì vậy đây có thể là câu hỏi noob, nhưng tôi đang gặp sự cố khi đặt hàng một tập hợp con của một khung dữ liệu. Nếu tôi sử dụng khung dữ liệu mtcars bằng cách sử dụng attach(mtcars), tôi có thể dễ dàng đặt hàng bằng cách sử dụng ord.cars <- mtcars[order(hp),]. Vấn đề là, nếu tôi sử dụng một tập hợp con, chúng ta hãy nói sub.cars <- subset(mtcars, hp > 120) và cố gắng đặt nó bằng cách sử ord.sub <- sub.cars[order(mpg),], kết quả như sau:R tập hợp dữ liệu phân loại

     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 

Tại sao R đưa trở lại như NA tất cả các hàng bị bỏ ra khỏi tập hợp con?

Cảm ơn trước!

+2

Tôi đoán đây là vấn đề liên quan đến việc bạn sử dụng 'attach()' không được đề xuất trong R. Hãy thử cách sau: tách bộ dữ liệu và sau đó sử dụng '[' và/hoặc '$' và nếu bạn thích 'with()' để tập hợp dữ liệu của bạn: 'tách (mtcars); ord.cars <- mtcars [order (mtcars $ hp),]; sub.cars <- tập con (mtcars, hp> 120); ord.sub <- sub.cars [thứ tự (sub.cars $ mpg),] '. Điều đó có hoạt động như mong đợi không? –

+0

@beginneR Vui lòng đăng câu trả lời đó. – Thomas

+0

Roger rằng, @Thomas :) –

Trả lời

7

Đây là vấn đề liên quan đến việc bạn sử dụng attach() không được đề xuất trong R - vì lý do chính xác này! Vấn đề là, mã của bạn là loại mơ hồ, hoặc ít nhất, nó là một cái gì đó khác với những gì bạn mong đợi nó được.

Cách giải quyết vấn đề này?

  1. detach tập dữ liệu và
  2. không sử dụng attach một lần nữa. Thay vào đó, hãy sử dụng [ và/hoặc $ và nếu bạn thích with() để đặt dữ liệu của mình.

Đây là cách bạn có thể làm điều đó cho ví dụ:

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 

gì chính xác gây ra vấn đề trong mã của bạn?

Sau khi bạn attached dữ liệu mtcars, bất cứ khi nào bạn gọi một trong các tên cột của dữ liệu đính kèm, như mpg, nó sẽ tham chiếu đến tập dữ liệu đính kèm (dữ liệu gốc mtcats). Vấn đề sau đó là bạn subsetted dữ liệu và lưu trữ nó trong một đối tượng mới (sub.cars) mà không được đính kèm trong khi mtcars vẫn còn gắn liền. Sau đó, khi bạn cố gắng sắp xếp dữ liệu sub.cars, bạn đã sử dụng sub.cars[order(mpg),] và như bạn có thể thấy, trong đó, bạn tham khảo cột mpg - được diễn giải bởi R là cột từ tập dữ liệu mtcars đính kèm (nguyên bản), nhiều hàng hơn dữ liệu được subsetted của bạn. Tất cả các hàng trong các biểu mẫu phụ của bạn đã bị loại trừ bởi việc đặt trước, giờ đây sẽ được hiển thị dưới dạng NA trong sub.cars.

Bài học: không sử dụng attach().

+0

Cảm ơn rất nhiều vì đã dành thời gian và kiên nhẫn của bạn! – Tommy

Các vấn đề liên quan