Specificarea colClasses în fișierul read.csv (Programare, R, Csv, Read.Csv)

defoo a intrebat.

Încerc să precizez colClasses opțiuni în fișierul read.csv în R. În datele mele, prima coloană „time” este practic un vector de caractere, în timp ce restul coloanelor sunt numerice.

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

În comanda de mai sus, aș dori ca R să citească coloana „time” ca „character” (caracter) și restul ca fiind numerice. Deși, variabila „data” a avut rezultatul corect după finalizarea comenzii, R a returnat următoarele avertismente. Mă întreb cum aș putea remedia aceste avertismente?

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

7 răspunsuri
George Dontas

Vectorul colClasses trebuie să aibă o lungime egală cu numărul de coloane importate. Presupunând că restul coloanele din setul de date sunt 5:

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

Comentarii

  • se poate folosi probabil următorul procedeu pentru a citi prima linie din csv și a determina câte coloane există. scan(csv,sep=’,’, what=”character” , nlines=1 ) – –  > Por defoo.
  • 36

  • Acesta este de fapt un răspuns incorect și m-a derutat pentru o vreme. Răspunsul corect este mai jos. Nu încerc să fiu nesimțit, am vrut doar să mă asigur că nu i se întâmplă nimănui altcuiva. –  > Por Rob.
  • @Rob În cazul meu, acesta este încă răspunsul corect, atunci când trebuie să specificați și clasele celorlalte variabile, iar acestea nu sunt recunoscute automat ca atare de către read.table. –  > Por tchakravarty.
Etienne

Puteți specifica colClasse doar pentru o singură coloană.

Deci, în exemplul tău ar trebui să folosești:

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

Comentarii

    24

  • Nu că ar conta prea mult, dar am constatat că acest lucru funcționează fără a cita numele coloanei. –  > Por Hendy.
  • Această abordare este, de fapt, foarte utilă atunci când încercați să citiți numere întregi cotate ca caractere. Vă mulțumim! –  > Por nils-holmberg.
wkmor1

Presupunând că coloana „time” are cel puțin o observație cu un caracter nenumeric și că toate celelalte coloane au doar numere, atunci opțiunea implicită a programului „read.csv” va fi să citească „time” ca „factor” și toate celelalte coloane ca „numeric”. Prin urmare, setarea „stringsAsFactors=F” va avea același rezultat ca și setarea manuală a „colClasses”, adică,

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

scentoni

Dacă doriți să vă referiți la nume din antet mai degrabă decât la numere de coloane, puteți folosi ceva de genul acesta:

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)

elcortegano

Știu că OP a întrebat despre utils::read.csv dar permiteți-mi să ofer un răspuns pentru cei care vin aici căutând cum să facă acest lucru folosind readr::read_csv din tidyverse.

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

Acest lucru ar trebui să seteze tipul implicit pentru toate coloanele ca fiind caracter, în timp ce time va fi analizat ca număr întreg.

Odysseus Ithaca

Pentru mai multe coloane de datetime fără antet și cu multe coloane, să zicem că câmpurile mele de datetime sunt în coloanele 36 și 38 și vreau să fie citite ca și câmpuri de caractere:

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

Seapen

Dacă combinăm ceea ce au contribuit @Hendy și @Oddysseus Ithaca, obținem o bucată de cod mai curat și mai general (adică adaptabil?).

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

Tags:, ,