2012-10-20 12 views
9

Tôi có một số dữ liệu bệnh viện trong một khung dữ liệu, đọc từ một csv. Tôi muốn yêu cầu các dataframe bởi một người dùng định nghĩa cột col và sau đó theo tên của bệnh viện như vậy:Cột khung dữ liệu số thứ tự không chính xác như chuỗi

col <- 'Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia' 
hospitals.sorted <- hospitals[order(hospitals[,col], hospitals$Hospital.Name),] 

Nhưng tôi nghĩ rằng tôi là thiếu một cái gì đó; có vẻ như để sắp xếp col như dây:

> hospitals.sorted 
... # so far so good # ... 
2749             10.0 
2831             10.0 
2891             10.0 
2837             10.1 
2824             10.1 
2774             10.1 
... # not so good # ... 
2856             15.7 
2834             15.9 
2797             16.0 
2835             7.4 
2850             7.7 
2789             8.1 
... # there are some non-numeric values at the very bottom # ... 
2806             9.9 
2867             9.9 
2884             9.9 
2808           Not Available 
2913           Not Available 
2911           Not Available 

Chỉ để xác nhận cột là trong thực tế số:

> sapply(hospitals, mode) 
Hospital.30.Day.Death..Mortality..Rates.from.Pneumonia 
"numeric" 
Hospital.Name 
"numeric" 

Tôi không biết tại sao Hospital.Name là số khi nó rõ ràng là không.

Những điều khác tôi đã cố gắng vô ích:

  • sử dụng as.numeric(hospitals[,col]) bên trong order
  • loại bỏ các giá trị "Not Available" trước khi sắp xếp

tôi có thể bị thiếu một cái gì đó cơ bản. Halp!

+2

Hãy thử 'str (bệnh viện)'? Bạn có thể có vấn đề với các yếu tố. –

Trả lời

16

Trong khung dữ liệu, các thành phần riêng lẻ phải là vectơ nguyên tử. Bạn đang bao gồm cả dữ liệu số và ký tự trong biến mà bạn đề cập, và như vậy R sẽ đọc nó dưới dạng vectơ ký tự. Tuy nhiên, do cài đặt mặc định của đối số stringsAsFactors mà vectơ ký tự sẽ được chuyển đổi thành một yếu tố. Và do đó nó sẽ trông giống như những con số được lưu trữ như số. Tuy nhiên, đó chỉ là nhãn và bạn đang bị lừa dối.

Tương tự, cuộc gọi mode() cũng đang lừa dối bạn. Hãy xem xét

> mode(factor(c(1:10, "a"))) 
[1] "numeric" 

Tuy nhiên, điều này rõ ràng không phải là dữ liệu "số". Tiếp theo xem xét

> mode(factor(letters)) 
[1] "numeric" 

này belies một thực tế rằng các yếu tố nội bộ R được lưu trữ như các biến số và đó là những gì mode() là nói cho bạn. mode() là công cụ sai cho công việc này.

Để kiểm tra xem một biến là số, sử dụng is.numeric() thay vì:

> is.numeric(factor(c(1:10, "a"))) 
[1] FALSE 
> is.numeric(factor(letters)) 
[1] FALSE 

Như vào dung dịch. "Không khả dụng" cần được đặt thành NA. Bạn có thể thực hiện việc này khi đọc dữ liệu bằng cách thêm na.strings = "Not Available" vào số read.table() (hoặc bất kỳ trình bao bọc nào bạn đã sử dụng) gọi. Điều đó là đủ để phân loại nhân vật> chuyển đổi nhân tố.

Mẹo hàng đầu là luôn xem xét đầu ra của str() áp dụng cho đối tượng của bạn để kiểm tra xem R đã đọc dữ liệu như bạn muốn. Vì vậy, bạn nên làm:

str(hospitals) 

và lưu ý các loại biến theo R.

Về những điều khác mà bạn đã cố gắng:

  1. as.numeric(hospitals[,col]) sẽ sản xuất các vector số chứa ID mức cho mỗi phần tử của yếu tố. Nếu yếu tố sắp xếp theo một thứ tự cụ thể, thì nó sẽ đại diện cho nó. Để chuyển đổi một yếu tố (phiên bản được gắn nhãn) thành một số, bạn cần một bước trung gian: as.numeric(as.character(hospitals[, col])). Điều này sẽ không giải quyết vấn đề thực tế bạn có ở đây mặc dù, bởi vì bạn có dữ liệu ký tự trong biến và R sẽ không thể chuyển đổi nó thành số. Nó sẽ chuyển đổi "Not Available" thành NA, có thể đã hoạt động nếu bạn đã thử as.numeric(as.character(hospitals[, col])).
  2. Bằng cách xóa "Not Available", tôi giả sử bằng cách xóa các hàng/yếu tố đó ?, sẽ vẫn để lại các quan sát còn lại trong một yếu tố. Mà vì lý do nêu trên sẽ không hoạt động vì nó sẽ phân loại alpha trên nhãn/cấp.
+0

Cảm ơn bạn đã trả lời nhanh chóng và đầy đủ thông tin! – greenbeansugar