2010-05-10 3 views
83

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

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" là "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 đây. Tôi 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

Trả lời

69

Các vector colClasses phải có chiều dài bằng với số cột nhập khẩu. Giả sử các còn lại các cột dữ liệu của bạn là 5 cách:

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

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

+22

Điều này thực sự là một câu trả lời sai và đã ném tôi đi một lúc. Câu trả lời đúng là dưới đây. Không cố gắng để trở thành một kẻ giật gân, chỉ muốn chắc chắn rằng nó không xảy ra với bất cứ ai khác. – Rob

+3

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

11

Giả sử cột 'thời gian' của bạn có ít nhất một quan sát với một nhân vật không phải số và tất cả các cột khác của bạn chỉ có số lượng, sau đó 'của read.csv mặc định sẽ là để đọc trong 'thời gian' như là một 'yếu tố' và tất cả các phần còn lại của các cột là 'số'. Do đó thiết lập 'stringsAsFactors = F' sẽ có kết quả tương tự như cài đặt 'colClasses' bằng tay ví dụ:

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

Bạn có thể chỉ định colClasse cho chỉ có 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")) 
+17

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

10

Nếu bạn muốn tham khảo tên từ tiêu đề chứ không phải là số cột, bạn có thể sử dụng một cái gì đó như thế này:

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) 
1

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

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