2010-05-10 14 views
83

Próbuję określić opcje colClasses w funkcji w R. W moich danych, pierwsza kolumna "czas" jest w zasadzie znakiem wektora, podczas gdy reszta kolumn jest numeryczna.Określanie colClasses w read.csv

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

W powyższym poleceniu chciałbym, żeby R odczytał w kolumnie "czas" jako "znak", a reszta jako numeryczną. Chociaż zmienna "data" miała poprawny wynik po zakończeniu polecenia, R zwrócił następujące ostrzeżenia. Zastanawiam się, jak mogę naprawić te ostrzeżenia?

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

Odpowiedz

69

Wektor colClasses musi mieć długość równą liczbie importowanych kolumn. Zakładając, że odpoczynek swoich kolumnach zestawu danych są 5:

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

Najprawdopodobniej można użyć poniższego, aby przeczytać pierwszy wiersz csv i określić ile kolumn istnieje. skan (csv, sep = ',', what = "character", nlines = 1) – defoo

+22

To właściwie jest niepoprawna odpowiedź i odrzuciło mnie na chwilę. Prawidłowa odpowiedź znajduje się poniżej. Nie próbując być palantem, chciałem tylko upewnić się, że nikomu to się nie zdarzy. – Rob

+3

@Rob W moim przypadku jest to nadal poprawna odpowiedź, gdy trzeba również określić klasy innych zmiennych i nie są one automatycznie rozpoznawane jako takie przez "read.table". – tchakravarty

11

Zakładając kolumnie „czas” ma co najmniej jedno spostrzeżenie o charakterze non-numeryczną i wszystkie inne kolumny mają tylko numery, a następnie „read.csv'S domyślną wartością będzie "czas" jako "czynnik", a pozostałe kolumny jako "numeryczne". Dlatego ustawienie „stringsAsFactors = F” będzie miał taki sam wynik jak ustawienie na „colClasses” ręcznie tj

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

Można określić colClasse tylko jeden kolumnach.

Więc w przykładzie należy użyć:

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

Nie ma to większego znaczenia, ale uznałem, że działa to bez cytowania nazwy kolumny. – Hendy

10

Jeśli chcesz odwołać się do nazw z nagłówka zamiast numerów kolumn, można użyć coś takiego:

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

dla wielu datetime kolumn bez nagłówka i wiele kolumn, powiedzmy, że moje pola datetime są w kolumnach 36 i 38 i chcę, aby były odczytywane jako pola znaków:

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