问题描述
我必须读取一个大的 .csv 文件,而 read.csv 需要一段时间。我读到我应该使用 read.csv 读取几行,获取列类,然后读取整个文件。我试图这样做:
read.csv(full_path_astro_data,header=TRUE,sep=",",comment.char="",nrow=100,stringsAsFactors=FALSE) %>%
sapply(class) -> col.classes
df_astro_data <- read.csv(full_path_astro_data,colClasses=col.classes,nrow=47000,stringsAsFactors=FALSE)
但后来我收到一条错误消息:
Error in scan(file = file,what = what,sep = sep,quote = quote,dec = dec,:
scan() expected 'an integer',got '0.0776562500000022'
看起来包含数字(双精度?)数据的列被错误地归类为整数。这可能是因为某些数字列在开头有许多零。所以我试图增加第一个 read.csv 命令中的行数,但这不起作用。我发现的一种解决方案是
col.classes %>%
sapply(function(x) ifelse(x=="integer","numeric",x)) -> col.classes
有了这个,文件的读取速度比不指定列类要快得多。不过,最好是所有列都正确分类。
有什么见解吗?
谢谢
解决方法
我怀疑您的行样本中的某些列仅包含整数,但在行样本之外它们包含非整数,我怀疑您是正确的。这是大文件的常见问题。您需要增加行样本大小,或者为出现这种情况的某些列明确指定列类型。
需要注意的是,readr
的 read_csv
会自动进行此行采样。来自文档:“所有列类型都将从输入的前 1000 行进行插补。这很方便(且快速),但不可靠。如果插补失败,您需要自己提供正确的类型。”你可以这样做:
read_csv( YourPathName,col_types = cols(YourProblemColumn1 = col_double(),YourProblemColumn2 = col_double())
)