Read.csv dosyasında colClasses'ı belirtme


108

R'deki fonksiyondaki colClassesseçenekleri belirtmeye çalışıyorum. read.csvVerilerimde, ilk sütun "zaman" temelde bir karakter vektörü iken, sütunların geri kalanı sayısaldır.

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

Yukarıdaki komutta, R'nin "zaman" sütununda "karakter" olarak ve geri kalanını sayısal olarak okumasını isterim. "Data" değişkeni, komut tamamlandıktan sonra doğru sonuca sahip olmasına rağmen, R aşağıdaki uyarıları döndürdü. Bu uyarıları nasıl düzeltebileceğimi merak ediyorum?

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.

Yanıtlar:


78

ColClasses vektörünün uzunluğu, içe aktarılan sütunların sayısına eşit olmalıdır. Veri kümesi sütunlarınızın geri kalanının 5 olduğunu varsayarsak :

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

7
csv'nin ilk satırını okumak ve kaç tane sütun olduğunu belirlemek için muhtemelen aşağıdakiler kullanılabilir. scan (csv, sep = ',', what = "character",
nlines

34
Bu aslında yanlış bir cevap ve beni bir süre uzaklaştırdı. Doğru cevap aşağıdadır. Aptal olmaya çalışmıyorum, sadece başkasının başına gelmemesini istedim.
Rob

3
@Rob Benim durumumda, diğer değişkenlerin sınıflarını da belirtmeniz gerektiğinde bu hala doğru cevaptır ve bunlar tarafından otomatik olarak tanınmazlar read.table.
tchakravarty

173

ColClasse'ı yalnızca bir sütun için belirtebilirsiniz.

Yani örneğinizde şunları kullanmalısınız:

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

21
Çok önemli değil, ama sütun adını alıntı yapmadan bunun işe yaradığını buldum.
Hendy

Bu yaklaşım, alıntılanmış tam sayıları karakter olarak okumaya çalışırken aslında çok kullanışlıdır. Teşekkürler!
nils-holmberg

14

'Zaman' sütununuzun sayısal olmayan bir karaktere sahip en az bir gözlem içerdiğini ve diğer tüm sütunlarınızın yalnızca sayı içerdiğini varsayarsak, 'read.csv'nin varsayılanı' zaman'ı 'faktör' olarak okumak olacaktır ve geri kalan tüm sütunlar 'sayısal' olarak. Bu nedenle, 'stringsAsFactors = F' ayarının yapılması 'colClass'ların manuel olarak ayarlanmasıyla aynı sonucu verecektir, yani,

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

10

İsimlere sütun numaraları yerine başlıktan atıfta bulunmak istiyorsanız, şunun gibi bir şey kullanabilirsiniz:

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

Başlığı olmayan birden çok tarih saat sütunu ve çok sayıda sütun için, tarih saat alanlarımın 36 ve 38 numaralı sütunlarda olduğunu ve bunların karakter alanları olarak okunmasını istediğimi varsayalım:

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

3

OP'nin utils::read.csvişlevi sorduğunu biliyorum , ancak buraya readr::read_csvgelenler için tidyverse kullanarak nasıl yapılacağını araştıran bir cevap vereyim.

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

Bu, tüm sütunlar için varsayılan türü karakter olarak ayarlamalı, zaman ise tamsayı olarak ayrıştırılmalıdır.


0

@Hendy ve @Oddysseus Ithaca'nın katkılarını birleştirirsek, daha temiz ve daha genel (yani uyarlanabilir mi?) Bir kod yığını elde ederiz.

    data <- read.csv("test.csv", head = F, colClasses = c(V36 = "character", V38 = "character"))                        
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.