Chỉ định colClasses trong read.csv


108

Tôi đang cố gắng chỉ định các colClassestùy chọn trong read.csvhàm trong R. Trong dữ liệu của tôi, cột đầu tiên "thời gian" về cơ bản là một vectơ ký tự trong khi phần còn lại của các cột là số.

data <- read.csv("test.csv", comment.char="" , 
                 colClasses=c(time="character", "numeric"), 
                 strip.white=FALSE)

Trong lệnh trên, tôi muốn R đọc trong cột "thời gian" dưới dạng "ký tự" và phần còn lại là số. Mặc dù, biến "data" có kết quả chính xác sau khi lệnh hoàn thành, R trả về các cảnh báo sau. Tôi đang tự hỏi làm thế nào tôi có thể sửa chữa những cảnh báo này?

Warning messages:
 1: In read.table(file = file, header = header, sep = sep, quote = quote,  :
    not all columns named in 'colClasses' exist
 2: In tmp[i[i > 0L]] <- colClasses :
    number of items to replace is not a multiple of replacement length

Derek

Câu trả lời:


78

Vectơ colClasses phải có độ dài bằng số cột được nhập. Giả sử phần còn lại của các cột tập dữ liệu của bạn là 5:

colClasses=c("character",rep("numeric",5))

7
người ta có thể sử dụng phần sau để đọc dòng đầu tiên của csv và xác định có bao nhiêu cột. quét (csv, sep = ',', what = "character", nlines = 1)
defoo

34
Đây thực sự là một câu trả lời không chính xác và đã khiến tôi thất vọng trong một thời gian ngắn. Câu trả lời chính xác là dưới đây. Không cố gắng trở thành một kẻ ngốc, chỉ muốn đảm bảo rằng điều đó không xảy ra với bất kỳ ai khác.
Rob

3
@Rob Trong trường hợp của tôi, đây vẫn là câu trả lời chính xác, khi bạn cũng cần chỉ định các lớp của các biến khác và chúng không được tự động nhận dạng như vậy read.table.
tchakravarty

173

Bạn có thể chỉ định colClasse chỉ cho một cột.

Vì vậy, trong ví dụ của bạn, bạn nên sử dụng:

data <- read.csv('test.csv', colClasses=c("time"="character"))

21
Nó không quan trọng lắm, nhưng tôi thấy nó hoạt động mà không cần trích dẫn tên cột.
Hendy

Cách tiếp cận này thực sự rất hữu ích khi cố gắng đọc các số nguyên được trích dẫn dưới dạng ký tự. Cảm ơn!
nils-holmberg

14

Giả sử cột 'thời gian' của bạn có ít nhất một lần quan sát có ký tự không phải số và tất cả các cột khác của bạn chỉ có số, thì mặc định của 'read.csv sẽ được đọc trong' thời gian 'dưới dạng' hệ số 'và tất cả phần còn lại của các cột dưới dạng 'số'. Do đó việc đặt 'stringAsFactors = F' sẽ có kết quả giống như việc đặt 'colClasses' theo cách thủ công, tức là

data <- read.csv('test.csv', stringsAsFactors=F)

10

Nếu bạn muốn tham chiếu đến tên từ tiêu đề thay vì số cột, bạn có thể sử dụng một cái gì đó như sau:

fname <- "test.csv"
headset <- read.csv(fname, header = TRUE, nrows = 10)
classes <- sapply(headset, class)
classes[names(classes) %in% c("time")] <- "character"
dataset <- read.csv(fname, header = TRUE, colClasses = classes)

4

Đối với nhiều cột ngày giờ không có tiêu đề và nhiều cột, giả sử các trường ngày giờ của tôi nằm trong cột 36 và 38 và tôi muốn chúng đọc dưới dạng trường ký tự:

data<-read.csv("test.csv", head=FALSE,   colClasses=c("V36"="character","V38"="character"))                        

3

Tôi biết OP đã hỏi về utils::read.csvchức năng này, nhưng hãy để tôi cung cấp câu trả lời cho những điều này mà tôi đến đây tìm kiếm cách thực hiện nó bằng cách sử dụng readr::read_csvngăn nắp.

read_csv ("test.csv", col_names=FALSE, col_types = cols (.default = "c", time = "i"))

Điều này sẽ đặt kiểu mặc định cho tất cả các cột là ký tự , trong khi thời gian sẽ được phân tích cú pháp thành số nguyên.


0

Nếu chúng ta kết hợp những gì @Hendy và @Oddysseus Ithaca đã đóng góp, chúng ta sẽ có được một đoạn mã rõ ràng hơn và tổng quát hơn (tức là có thể thích ứng?).

    data <- read.csv("test.csv", head = F, colClasses = c(V36 = "character", V38 = "character"))                        
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.