在read.csv中指定colClasses

def*_*foo 101 csv r read.csv

我试图在R colClasses中的read.csv函数中指定选项.在我的数据中,第一列"时间"基本上是字符向量,而其余列是数字.

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

在上面的命令中,我希望R在"时间"列中读取"字符",其余为数字.虽然命令完成后"data"变量确实具有正确的结果,但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
Run Code Online (Sandbox Code Playgroud)

德里克

小智 156

您只能为一列指定colClasse.

所以在你的例子中你应该使用:

data <- read.csv('test.csv', colClasses=c("time"="character"))
Run Code Online (Sandbox Code Playgroud)

  • 这并不重要,但我发现这可以在不引用列名的情况下工作. (21认同)

Geo*_*tas 77

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

colClasses=c("character",rep("numeric",5))
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是一个错误的答案,并把我扔了一会儿.正确答案如下.不想成为一个混蛋,只是想确保它不会发生在其他任何人身上. (29认同)
  • 一个人可以使用以下内容来读取csv的第一行并确定有多少列.scan(csv,sep =',',what ="character",nlines = 1) (7认同)
  • @Rob在我的情况下,这仍然是正确的答案,当你还需要指定其他变量的类时,它们不会被`read.table`自动识别. (3认同)

wkm*_*or1 13

假设你的'时间'列至少有一个带有非数字字符的观察,而你的所有其他列只有数字,那么'read.csv的默认值将是'时间'作为'因子'读取,其余的全部是列为"数字".因此,设置'stringsAsFactors = F'将与手动设置'colClasses'具有相同的结果,即

data <- read.csv('test.csv', stringsAsFactors=F)
Run Code Online (Sandbox Code Playgroud)


sce*_*oni 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)
Run Code Online (Sandbox Code Playgroud)


elc*_*ano 8

我知道 OP 询问了该utils::read.csv功能,但让我为那些来到这里搜索如何使用readr::read_csvtidyverse 的人提供答案。

read_csv ("test.csv", col_names=FALSE, col_types = cols (.default = "c", time = "i"))
Run Code Online (Sandbox Code Playgroud)

这应该将所有列的默认类型设置为character,而time将被解析为整数。


小智 5

对于没有标题的多个日期时间列和很多列,假设我的日期时间字段位于第 36 和 38 列中,我希望它们作为字符字段读入:

data<-read.csv("test.csv", head=FALSE,   colClasses=c("V36"="character","V38"="character"))                        
Run Code Online (Sandbox Code Playgroud)