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

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

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

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)

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)

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

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.


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"))                        
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.