Menentukan colClasses di read.csv

108

Saya mencoba untuk menentukan colClassesopsi dalam read.csvfungsi di R. Dalam data saya, kolom pertama "waktu" pada dasarnya adalah vektor karakter sedangkan kolom lainnya adalah numerik.

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

Pada perintah di atas, saya ingin R membaca di kolom "waktu" sebagai "karakter" dan sisanya sebagai numerik. Meskipun, variabel "data" memang memiliki hasil yang benar setelah perintah diselesaikan, R mengembalikan peringatan berikut. Saya bertanya-tanya bagaimana cara memperbaiki peringatan ini?

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

defoo
sumber

Jawaban:

78

Vektor colClasses harus memiliki panjang yang sama dengan jumlah kolom yang diimpor. Misalkan sisa kolom set data Anda adalah 5:

colClasses=c("character",rep("numeric",5))
George Dontas
sumber
7
satu mungkin dapat menggunakan yang berikut ini untuk membaca baris pertama dari csv dan menentukan berapa banyak kolom yang ada. scan (csv, sep = ',', what = "character", nlines = 1)
defoo
34
Ini sebenarnya adalah jawaban yang salah dan membuat saya marah untuk sementara waktu. Jawaban yang benar ada di bawah. Tidak mencoba menjadi orang brengsek, hanya ingin memastikan hal itu tidak terjadi pada orang lain.
Rob
3
@Rob Dalam kasus saya, ini masih merupakan jawaban yang benar, ketika Anda juga perlu menentukan kelas variabel lain, dan mereka tidak secara otomatis dikenali oleh read.table.
tchakravarty
173

Anda dapat menentukan colClasse hanya untuk satu kolom.

Jadi dalam contoh Anda, Anda harus menggunakan:

data <- read.csv('test.csv', colClasses=c("time"="character"))
Etienne
sumber
21
Bukan berarti itu terlalu penting, tetapi saya menemukan ini berfungsi tanpa mengutip nama kolom.
Hendy
Pendekatan ini sebenarnya sangat berguna saat mencoba membaca bilangan bulat yang dikutip sebagai karakter. Terima kasih!
nils-holmberg
14

Dengan asumsi kolom 'waktu' Anda memiliki setidaknya satu pengamatan dengan karakter non-numerik dan semua kolom Anda yang lain hanya memiliki angka, maka default 'read.csv' adalah membaca dalam 'waktu' sebagai 'faktor' dan sisanya kolom sebagai 'numerik'. Oleh karena itu pengaturan 'stringsAsFactors = F' akan memiliki hasil yang sama seperti pengaturan 'colClasses' secara manual yaitu,

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

Jika Anda ingin merujuk ke nama dari header daripada nomor kolom, Anda dapat menggunakan sesuatu seperti ini:

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)
scentoni
sumber
4

Untuk beberapa kolom datetime tanpa header, dan banyak kolom, katakan bidang datetime saya ada di kolom 36 dan 38, dan saya ingin mereka membacanya sebagai kolom karakter:

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

Saya tahu OP bertanya tentang utils::read.csvfungsinya, tetapi izinkan saya memberikan jawaban untuk ini yang datang ke sini mencari cara melakukannya menggunakan readr::read_csvdari tidyverse.

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

Ini harus menyetel tipe default untuk semua kolom sebagai karakter , sementara waktu akan diuraikan sebagai integer.

elcortegano.dll
sumber
0

Jika kita menggabungkan apa yang disumbangkan @Hendy dan @Oddysseus Ithaca, kita mendapatkan potongan kode yang lebih bersih dan lebih umum (yaitu, mudah beradaptasi?).

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