在read.csv中指定colClasses


108

我试图在R colClasses中的read.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

德里克

Answers:


78

colClasses向量的长度必须等于导入的列数。假设其余的数据集列为5:

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

7
可能可以使用以下内容读取csv的第一行,并确定有多少列。scan(csv,sep =',',what =“ character”,nlines = 1)
defoo 2010年

34
这实际上是一个错误的答案,让我离开了一段时间。正确答案如下。不试图成为一个混蛋,只是想确保它不会发生在其他任何人身上。
罗布2012年

3
@Rob在我的情况下,这仍然是正确的答案,当您还需要指定其他变量的类,并且不会自动识别它们时read.table
tchakravarty 2014年

173

您只能为一列指定colClasse。

因此,在您的示例中,您应该使用:

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

21
没什么关系,但是我发现它无需引用列名即可工作。
Hendy 2014年

当尝试读取带引号的整数作为字符时,此方法实际上非常有用。谢谢!
nils-holmberg

14

假设您的“时间”列至少包含一个非数字字符的观察值,而所有其他列均仅包含数字,则“ read.csv”的默认设置是将“时间”作为“因子”读取,其余所有列为“数字”。因此,设置“ 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

对于没有标题的多个datetime列以及很多列,请说我的datetime字段位于第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"))                        
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.