read.csvでのcolClassesの指定


108

R colClassesread.csv関数でオプションを指定しようとしています。私のデータでは、最初の列「時間」は基本的に文字ベクトルで、残りの列は数値です。

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

上記のコマンドでは、Rが「時間」列を「文字」として読み取り、残りを数値として読み取るようにします。コマンドが完了した後、「データ」変数は正しい結果でしたが、Rは次の警告を返しました。これらの警告を修正するにはどうすればよいですか?

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

デレク

回答:


78

colClassesベクトルの長さは、インポートされた列の数と同じでなければなりません。仮に残りのデータセットの列は、5以下のとおりです。

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

7
おそらく次を使用してcsvの最初の行を読み取り、そこにある列の数を決定できます。scan(csv、sep = '、'、what = "character"、nlines = 1)
defoo

34
これは実際には不正解であり、しばらくの間私を捨てました。正解は以下のとおりです。ジャークになろうとするのではなく、それが他の誰にも起こらないようにしたかっただけです。
Rob

3
@Rob私の場合、これは正しい答えです。他の変数のクラスも指定する必要があり、それらはによって自動的に認識されませんread.table
tchakravarty 14

173

colClasseは1つの列に対してのみ指定できます。

だからあなたの例ではあなたが使うべきです:

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

21
それほど重要ではありませんが、列名を引用しなくても機能することがわかりました。
ヘンディ2014

この方法は、引用符で囲まれた整数を文字として読み込もうとする場合に非常に便利です。ありがとう!
nils-holmberg

14

「time」列に非数値文字の観測値が少なくとも1つあり、他のすべての列に数値しかない場合、「read.csv」のデフォルトでは「time」を「因子」として読み取り、残りのすべての列を読み取ります。 「数値」としての列。したがって、 'stringsAsFactors = F'を設定すると、 'colClasses'を手動で設定した場合と同じ結果になります。

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

10

列番号ではなくヘッダーの名前を参照する場合は、次のようなものを使用できます。

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

ヘッダーのない複数の日時列と多数の列の場合、日時フィールドが列36と38にあり、文字フィールドとして読み取ってほしいとします。

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

3

OPがutils::read.csv関数について質問したことは知っていますがreadr::read_csv、tidyverseからそれを使用する方法を検索するためにここに来るこれらに対する答えを提供させてください。

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

これにより、すべての列のデフォルトのタイプがcharacterとして設定されますが、時間は整数として解析されます。


0

@Hendyと@Oddysseus Ithacaによる貢献を組み合わせると、よりクリーンでより一般的な(つまり、適応可能な)コードのチャンクが得られます。

    data <- read.csv("test.csv", head = F, colClasses = c(V36 = "character", V38 = "character"))                        
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.