2012-12-04 31 views
23

Tôi biết rằng có những câu hỏi tương tự trên trang web này, tuy nhiên, không có câu hỏi nào trong số họ dường như trả lời đủ câu hỏi của tôi.Nhập tệp csv vào R - giá trị số được đọc là ký tự

Đây là những gì tôi đã làm cho đến nay:

Tôi có một tập tin csv mà tôi mở trong excel. Tôi thao tác các cột đại số để có được một cột mới "A". Tôi nhập tệp vào R bằng cách sử dụng read.csv() và các mục nhập trong cột A được lưu trữ dưới dạng các yếu tố - Tôi muốn chúng được lưu trữ dưới dạng số. Tôi tìm thấy câu hỏi này về chủ đề này:

Imported a csv-dataset to R but the values becomes factors

Theo lời khuyên, tôi bao gồm stringsAsFactors = FALSE như một cuộc tranh cãi trong read.csv(), tuy nhiên, như Hồng Ooi đề xuất trong trang liên kết ở trên, điều này không gây ra các mục trong cột A được lưu trữ dưới dạng giá trị số.

Một giải pháp khả thi là sử dụng những lời khuyên được đưa ra trong các trang sau đây:

How to convert a factor to an integer\numeric without a loss of information?

tuy nhiên

, tôi muốn một giải pháp sạch hơn tức là một cách để nhập khẩu các tập tin để các mục của mục cột là được lưu trữ dưới dạng giá trị số.

Chúc mừng mọi trợ giúp!

+5

Excel được hosing với tập tin văn bản của bạn. Mở csv trong trình soạn thảo văn bản để xem Excel đang mang cái gì. –

+2

Có thể là vấn đề với ký hiệu thập phân không? Kiểm tra ký hiệu thập phân được sử dụng trong tệp CSV. Bạn có thể chỉ định ký tự được sử dụng làm ký hiệu thập phân với tùy chọn 'dec' trong' read.csv'. Xem '? Read.csv' để biết thêm thông tin. – djhurio

+0

làm những gì Joshua bảo bạn làm, nổi trội như một xu hướng tiêu diệt các tiêu đề csv. thông thường tôi sử dụng các tùy chọn (stringsAsFactors = FALSE) để tránh các yếu tố. –

Trả lời

22

Dù đại số bạn đang làm trong Excel để tạo ra các cột mới có thể có thể được thực hiện hiệu quả hơn trong R.

hãy thử như sau: Đọc liệu tập tin (trước khi bất kỳ thao tác xuất sắc) vào R sử dụng read.csv(... stringsAsFactors=FALSE) . [Nếu điều đó không hiệu quả, vui lòng xem ?read.table (trong đó read.csv kết thúc tốt đẹp), tuy nhiên có thể có một số vấn đề cơ bản khác].

Ví dụ:

delim = "," # or is it "\t" ? 
    dec = "." # or is it "," ? 
    myDataFrame <- read.csv("path/to/file.csv", header=TRUE, sep=delim, dec=dec, stringsAsFactors=FALSE) 

Sau đó, giả sử cột số của bạn là cột 4

myDataFrame[, 4] <- as.numeric(myDataFrame[, 4]) # you can also refer to the column by "itsName" 


Cuối cùng, nếu bạn cần bất kỳ sự giúp đỡ với việc hoàn thành trong R nhiệm vụ tương tự mà bạn' đã thực hiện trong Excel, có rất nhiều người ở đây, những người sẵn lòng trợ giúp bạn trong số

+0

Cảm ơn. Đây là một danh sách kiểm tra rất hữu ích. Trong trường hợp này, vấn đề đã được giải quyết bằng cách thực hiện thao tác đại số trong R ngược với Excel. – user32259

+0

Không có vấn đề @ user32259, rất vui được giúp đỡ –

9

Trong read.table (và người thân của nó) tôi t là đối số na.strings chỉ định chuỗi nào sẽ được hiểu là giá trị bị thiếu NA. Giá trị mặc định là na.strings = "NA"

Nếu thiếu giá trị trong một cột biến số khác được mã hóa dưới dạng "NA", ví dụ: "." hoặc "N/A", các hàng này sẽ được hiểu là character và sau đó toàn bộ cột được chuyển đổi thành character.

Do đó, nếu các giá trị bị thiếu của bạn là một số khác ngoài "NA", bạn cần chỉ định chúng trong na.strings.

3

Nếu bạn đang xử lý các tập dữ liệu lớn (tức làbộ dữ liệu với số lượng cột cao), giải pháp được lưu ý ở trên có thể được rườm rà theo cách thủ công và yêu cầu bạn biết cột nào là số một số ưu tiên.

Hãy thử thay vào đó.

char_data <- read.csv(input_filename, stringsAsFactors = F) 
num_data <- data.frame(data.matrix(char_data)) 
numeric_columns <- sapply(num_data,function(x){mean(as.numeric(is.na(x)))<0.5}) 
final_data <- data.frame(num_data[,numeric_columns], char_data[,!numeric_columns]) 

mã nào sau đây:

  1. Nhập khẩu dữ liệu của bạn như cột nhân vật.
  2. Tạo một phiên bản dữ liệu của bạn dưới dạng cột số.
  3. Xác định cột nào từ dữ liệu của bạn là số (giả sử các cột có dưới 50% NA khi chuyển đổi dữ liệu của bạn thành số thực sự là số).
  4. Hợp nhất các cột số và ký tự thành tập dữ liệu cuối cùng.

Điều này về cơ bản tự động nhập tệp .csv của bạn bằng cách giữ nguyên kiểu dữ liệu của cột gốc (dưới dạng ký tự và số).

1

phiên bản dành cho data.table dựa trên mã từ dmanuge:

convNumValues<-function(ds){ 
    ds<-data.table(ds) 
    dsnum<-data.table(data.matrix(ds)) 
    num_cols <- sapply(dsnum,function(x){mean(as.numeric(is.na(x)))<0.5}) 
    nds <- data.table( dsnum[, .SD, .SDcols=attributes(num_cols)$names[which(num_cols)]] 
         ,ds[, .SD, .SDcols=attributes(num_cols)$names[which(!num_cols)]]) 
return(nds) 
} 
Các vấn đề liên quan