2016-10-11 16 views
8

Tôi có một tập tin văn bản của dữ liệu số, với tiêu đề, nơi một số con số được nhập vào như phân số, một số được nhập vào là số nguyên, và một số được nhập vào như phao, ví dụ:phần Reading trong tập tin csv với R

col1name, col2name, col3name, col4name  
1, 2, 3, 4 
0.5, 0.6, 0.7, 0.8 
1/2, 2/3, 3/4, 4/5 
1, 0.2, 3/3, 4 

Khi tôi sử dụng read.csv, làm cách nào để các biểu thức này được đánh giá và lưu trữ dưới dạng số?

Cảm ơn ...

+0

Bạn có thể đăng mẫu tệp văn bản của mình ở đâu đó mà chúng tôi có thể tải xuống không? Sau đó, chúng tôi có thể thấy chính xác cấu trúc của dữ liệu bạn đang cố gắng nhập và cung cấp mã tùy chỉnh. – eipi10

+0

@eipi Tôi đã chỉnh sửa ví dụ để hiển thị cấu trúc của tệp tốt hơn. –

Trả lời

7

Trước tiên, hãy nhập dữ liệu của bạn dưới dạng vectơ của chuỗi ký tự. Sử dụng ví dụ đồ chơi của bạn trong câu hỏi chúng ta có thể làm điều này bằng

txt = "1, 2, 3, 0.3, 2/5, 0.75, 1/3" 
dat = read.table(text = txt, sep = ",", stringsAsFactors = F) 

Một khi bạn có dữ liệu của bạn trong một vector nhân vật, chúng ta có thể sử dụng eval(parse()) để đánh giá những biểu hiện như thể họ đã gõ vào tại giao diện điều khiển. Thật không may eval không vectorised, vì vậy chúng tôi quấn nó trong sapply, để áp dụng chức năng này để mỗi phần tử dữ liệu của bạn lần lượt

answer = sapply(dat, function(x) eval(parse(text = x))) 

Chúng ta có thể mở rộng này để đối phó với các dữ liệu multirow bằng cách áp dụng các phương pháp trên để mỗi cột tại một thời gian. Ví dụ: như thế này

txt = "col1name, col2name, col3name, col4name 
1, 2, 3, 4 
0.5, 0.6, 0.7, 0.8 
1/2, 2/3, 3/4, 4/5 
1, 0.2, 3/3, 4" 

dat = read.table(text = txt, sep = ",", stringsAsFactors = F, header = T) 
answer = apply(dat, 2, function(this.col) sapply(this.col, function(x) eval(parse(text = x)))) 
#  col1name col2name col3name col4name 
# [1,]  1.0 2.0000000  3.00  4.0 
# [2,]  0.5 0.6000000  0.70  0.8 
# [3,]  0.5 0.6666667  0.75  0.8 
# [4,]  1.0 0.2000000  1.00  4.0 
+0

Làm việc cho ví dụ đồ chơi, nhưng không phải cho một tệp văn bản có nhiều hơn chỉ hàng dữ liệu (nó chỉ giữ hàng cuối cùng). –

+0

Sau đó, bạn cần phải sử dụng điều này trên mỗi hàng lần lượt. Đây vẫn là cách để làm điều đó. – dww

+0

Có rất nhiều hàng ... –

1

Tôi đặc biệt khuyên bạn nên sử dụng fread() trong gói "data.table". Nó cực kỳ nhanh và rất mạnh mẽ trong hầu hết các tình huống.

input.file <- fread("file_name.csv") 

Nếu giá trị của bạn vẫn không nằm trong định dạng mà bạn đang tìm kiếm, bạn có thể sử dụng "as.integer()" hoặc "as.numeric()":

input.file$`Column Name To Change` <- as.numeric(input.file$`Column Name To Change`) 

Hope this helps !

+0

Thật không may là một trong những người đã làm việc. –

+0

@BenS. Các phân số được nhập vào csv như thế nào? Ví dụ, để nhập mỏ và giữ chúng ở đó, tôi đã thêm một dấu nháy đơn trước khi gõ phần 2/5. –

+0

@Richard Chúng không phải từ các tệp Excel. Chỉ là một tệp văn bản thuần túy trông giống như dòng tôi đã đưa ra làm ví dụ. –

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