2011-02-08 36 views
76

tôi đã nhập khẩu một tập tin thử nghiệm và cố gắng để tạo ra một biểu đồChuyển đổi chuỗi số

pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t") 
hist <- as.numeric(pichman$WS)  

Tuy nhiên, tôi nhận được các số khác nhau từ các giá trị trong tập dữ liệu của tôi. Ban đầu tôi nghĩ rằng điều này bởi vì tôi đã có văn bản, vì vậy tôi đã xóa văn bản:

table(pichman$WS)  
ws <- pichman$WS[pichman$WS!="Down" & pichman$WS!="NoData"]  

Tuy nhiên, tôi vẫn nhận được số lượng rất cao không ai có ý tưởng?

+0

Xem thêm http://stackoverflow.com/questions/4798343/ và http://stackoverflow.com/questions/3418128 – Aaron

Trả lời

97

Tôi nghi ngờ bạn đang gặp sự cố với các yếu tố. Ví dụ,

> x = factor(4:8) 
> x 
[1] 4 5 6 7 8 
Levels: 4 5 6 7 8 
> as.numeric(x) 
[1] 1 2 3 4 5 
> as.numeric(as.character(x)) 
[1] 4 5 6 7 8 

Một số nhận xét:

  • Bạn đề cập rằng vector của bạn có chứa các ký tự "Down" và "NoData". Điều gì mong đợi/muốn as.numeric để làm với các giá trị này?
  • Trong read.csv, hãy thử sử dụng lập luận stringsAsFactors=FALSE
  • Bạn có chắc chắn đó là sep="/t và không sep="\t"
  • Sử dụng lệnh head(pitchman) để kiểm tra fews hàng đầu tiên của dữ liệu của bạn
  • Ngoài ra, nó rất khó khăn để đoán biết bạn vấn đề là khi bạn không cung cấp dữ liệu. Một ví dụ làm việc tối thiểu là luôn luôn thích hợp hơn. Ví dụ, tôi không thể chạy lệnh pichman <- read.csv(file="picman.txt", header=TRUE, sep="/t") vì tôi không có quyền truy cập vào tập dữ liệu.
+1

Tôi đã thêm thời gian vào câu trả lời mới. +1 cho bạn khi bạn đã chỉnh sửa và đưa ra tất cả các tùy chọn. –

+0

cảm ơn một triệu! tôi đã xóa các giá trị "Down" và "NoData" sau khi tôi thấy rằng nó không chỉ là số và có tôi đã slashes của tôi trộn lên – eliavs

+0

tuyệt vời 1. điều này thực sự đã giúp tôi. – phoxis

10

Như csgillespie đã nói. stringsAsFactors là mặc định trên TRUE, nó chuyển đổi bất kỳ văn bản nào thành một yếu tố. Vì vậy, ngay cả sau khi xóa văn bản, bạn vẫn có một yếu tố trong khung dữ liệu của mình.

Bây giờ liên quan đến việc chuyển đổi, có một cách tối ưu hơn để làm như vậy. Vì vậy, tôi đặt nó ở đây như một tham chiếu:

> x <- factor(sample(4:8,10,replace=T)) 
> x 
[1] 6 4 8 6 7 6 8 5 8 4 
Levels: 4 5 6 7 8 
> as.numeric(levels(x))[x] 
[1] 6 4 8 6 7 6 8 5 8 4 

Để hiển thị nó hoạt động.

Các timings:

> x <- factor(sample(4:8,500000,replace=T)) 
> system.time(as.numeric(as.character(x))) 
    user system elapsed 
    0.11 0.00 0.11 
> system.time(as.numeric(levels(x))[x]) 
    user system elapsed 
     0  0  0 

Đó là một cải tiến lớn, nhưng không phải luôn luôn là một nút cổ chai. Nó được quan trọng tuy nhiên nếu bạn có một dataframe lớn và rất nhiều cột để chuyển đổi.

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