2011-12-05 35 views
6

Hôm nay tôi đã quyết định bắt đầu leo ​​lên đường cong học tập dốc của R. Tôi đã dành một vài giờ và tôi quản lý để nhập dữ liệu của mình và thực hiện một vài điều cơ bản khác nhưng tôi gặp sự cố với kiểu dữ liệu: một cột chứa số thập phân được nhập dưới dạng số nguyên và chuyển đổi thành hai lần thay đổi giá trị .Sự cố khi nhập tệp csv/chuyển đổi từ số nguyên thành gấp đôi trong R

Khi cố gắng lấy tệp csv nhỏ để đặt ở đây làm ví dụ, tôi phát hiện ra rằng sự cố chỉ xảy ra khi tệp dữ liệu quá lớn (tệp gốc của tôi là ma trận 1048418 x 12, nhưng thậm chí chỉ có " "5000 hàng tôi có cùng một vấn đề. Khi tôi chỉ có 100, 1000 hoặc thậm chí 2000 hàng, cột được nhập chính xác là gấp đôi).

Here là tập dữ liệu nhỏ hơn (vẫn còn 500kb, nhưng một lần nữa, nếu tập dữ liệu nhỏ thì vấn đề không được nhân rộng). Mã này là

> ex <- read.csv("exampleshort.csv",header=TRUE) 
> typeof(ex$RET) 
[1] "integer" 

Tại sao cột trả về được nhập dưới dạng số nguyên khi tệp lớn, khi rõ ràng là loại gấp đôi?

Điều tồi tệ nhất là nếu tôi cố gắng chuyển đổi nó sẽ tăng gấp đôi, các giá trị được thay đổi

> exdouble <- as.double(ex$RET) 
> typeof(exdouble) 
[1] "double" 

> ex$RET[1:5] 
[1] 0.005587 -0.005556 -0.005587 0.005618 -0.001862 
2077 Levels: -0.000413 -0.000532 -0.001082 -0.001199 -0.0012 -0.001285 -0.001337 -0.001351 -0.001357 -0.001481 -0.001486 -0.001488 ... 0.309524 

> exdouble[1:5] 
[1] 1305 321 322 1307 41 

Đây không phải là cột duy nhất được nhập khẩu sai, nhưng tôi đoán rằng nếu tôi tìm một giải pháp cho một cột, tôi có thể sắp xếp các cột khác. Dưới đây là một số thông tin hơn:

> sapply(ex,class) 
PERMNO  DATE COMNAM  SICCD  PRC  RET  RETX SHROUT VWRETD VWRETX EWRETD EWRETX 
"integer" "integer" "factor" "integer" "factor" "factor" "factor" "integer" "numeric" "numeric" "numeric" "numeric" 

Họ nên theo thứ tự: số nguyên, ngày tháng, chuỗi, số nguyên, đôi, gấp đôi, gấp đôi, số nguyên, đôi, gấp đôi, gấp đôi, gấp đôi (loại có lẽ là sai, nhưng hy vọng bạn sẽ hiểu ý tôi là gì)

+0

@Xu Wang: nửa đầu sẽ không hoạt động.Cắt giảm xuống 5 nghìn lần quan sát đầu tiên, ít hơn 1% dữ liệu của tôi, đã tạo ra vấn đề ... – Vivi

+0

xin lỗi vì tôi đã không hoàn thành nhận xét của mình vì tôi đã đọc và đọc trợ giúp 'read.csv'. Những gì tôi muốn nói là tôi nghĩ có lẽ có một số giá trị kỳ lạ mà nhầm lẫn với 'R'. Vì vậy, tôi nghĩ rằng đó không phải là một thực tế lớn hay nhỏ mà là tập dữ liệu lớn có một trong những ký tự hoặc giá trị khó hiểu đó. Điều đó có ý nghĩa? Nếu không, nó không quan trọng. Tôi nghĩ giải pháp là sử dụng đối số colClasses. –

+0

@Xu Wang Tôi hiểu những gì bạn đang nói, nhưng tôi vẫn không hoàn toàn chắc chắn về cách giải quyết vấn đề của tôi. Làm cách nào để sử dụng đối số colClasses? Bạn có thể cho tôi một dòng lệnh để nhập tệp này một cách chính xác bằng cách sử dụng đối số colClasses không? – Vivi

Trả lời

6

Xem trợ giúp cho read.csv: ?read.csv. Đây là phần có liên quan:

colClasses: character. A vector of classes to be assumed for the 
      columns. Recycled as necessary, or if the character vector 
      is named, unspecified values are taken to be ‘NA’. 

      Possible values are ‘NA’ (the default, when ‘type.convert’ is 
      used), ‘"NULL"’ (when the column is skipped), one of the 
      atomic vector classes (logical, integer, numeric, complex, 
      character, raw), or ‘"factor"’, ‘"Date"’ or ‘"POSIXct"’. 
      Otherwise there needs to be an ‘as’ method (from package 
      ‘methods’) for conversion from ‘"character"’ to the specified 
      formal class. 

      Note that ‘colClasses’ is specified per column (not per 
      variable) and so includes the column of row names (if any). 

Chúc bạn may mắn khi học qua một vài giai đoạn đầu (mà tôi thừa nhận phải mất chút thời gian).

thử này và sửa chữa những người khác cho phù hợp:

ex <- read.csv("exampleshort.csv",header=TRUE,colClasses=c("integer","integer","factor","integer","numeric","factor","factor","integer","numeric","numeric","numeric","numeric"), na.strings=c(".")) 

Như BenBolker chỉ ra, lập luận colClasses có lẽ là không cần thiết. Tuy nhiên, lưu ý rằng việc sử dụng đối số colClasses có thể làm cho hoạt động nhanh hơn, đặc biệt là với tập dữ liệu lớn.

na.strings phải được chỉ định. Xem phần sau trong ?read.csv:

na.strings: a character vector of strings which are to be interpreted 
     as ‘NA’ values. Blank fields are also considered to be 
     missing values in logical, integer, numeric and complex 
     fields. 

Đối với mục đích tham khảo (điều này không nên được sử dụng như một giải pháp bởi vì giải pháp tốt nhất là để nhập dữ liệu một cách chính xác trong một bước): RET đã không được nhập như một số nguyên. Nó đã được nhập dưới dạng factor. Để tham khảo trong tương lai, nếu bạn muốn chuyển đổi một factor đến một numeric, sử dụng

new_RET <-as.numeric(as.character(ex$RET))

+0

Tôi đã đọc phần này của sự giúp đỡ, nhưng tôi thành thật không hiểu điều này có nghĩa là gì (tôi chỉ mới bắt đầu sử dụng R ngày hôm nay). Cột đó chỉ có giá trị là 0 hoặc gấp đôi và không có giá trị bị thiếu. – Vivi

+0

Ah, ok. Các cột khác trong tập dữ liệu của bạn phải là gì? Họ có nhập ok không? Bạn có thể đăng đầu ra của 'sapply (ex, class)'. –

+0

Tôi đã thêm thông tin bạn yêu cầu vào cuối câu hỏi – Vivi

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