在read.csv中指定colClasses

124

我想在R的read.csv函数中指定colClasses选项。在我的数据中,第一列time基本上是一个字符向量,而其余的列都是数值型的。

data <- read.csv("test.csv", comment.char="" , 
                 colClasses=c(time="character", "numeric"), 
                 strip.white=FALSE)
在上述命令中,我希望R将time列读入为"字符",其余部分为数值。虽然在命令完成后,data变量确实具有正确的结果,但是R返回了以下警告信息。我想知道如何修复这些警告?
警告信息:
1:在'colClasses'中并非所有列名都存在
2:在tmp[i[i>0L]] <- colClasses中:要替换的项目数量不是替换长度的倍数
7个回答

203

您可以仅为一个列指定colClasse。

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

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

24
虽然这并不重要,但我发现在不引用列名的情况下也可以运行此操作。 - Hendy
这种方法在尝试将带引号的整数读取为字符时非常有用。谢谢! - nils-holmberg

89

colClasses向量的长度必须等于导入列的数量。假设你的数据集中有5个其它列:

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

7
可以使用以下代码读取 CSV 文件的第一行,并确定有多少列。scan(csv, sep=',', what="character", nlines=1) - defoo
37
这实际上是一个错误的答案,让我有一点困惑。正确的答案如下。不是想要表现得很自以为是,只是希望确保这种情况不会发生在其他人身上。 - Rob
4
在我的情况下,这仍然是正确答案,当你还需要指定其他变量的类别时,它们不能被read.table自动识别为这样。 - tchakravarty

14

假设您的“time”列中至少有一个非数字字符,而且所有其他列都只包含数字,那么“read.csv”的默认设置将把“time”读入为“factor”,并将其余所有列读入为“numeric”。因此,设置“stringsAsFactors=F”将产生与手动设置“colClasses”相同的结果,即

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

12

如果你想使用标题中的名称而不是列号,请使用类似以下的代码:

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)

10

我知道OP问的是关于utils::read.csv函数的,但让我为那些在这里搜索如何使用tidyverse中的readr::read_csv来做到这一点的人提供一个答案。

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

这应该将所有列的默认类型设置为字符,而时间将被解析为整数。


5
对于没有标题的多个日期时间列和许多列,比如我的日期时间字段在第36列和第38列,并且我想将它们读取为字符字段:
data<-read.csv("test.csv", head=FALSE,   colClasses=c("V36"="character","V38"="character"))                        

0
如果我们将@Hendy和@Odysseus Ithaca贡献的内容结合起来,我们会得到更干净、更通用(即可适应?)的代码块。
    data <- read.csv("test.csv", head = F, colClasses = c(V36 = "character", V38 = "character"))                        

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接