【发布时间】:2021-06-29 10:12:59
【问题描述】:
我必须阅读一个大的 .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,
header=TRUE,
sep=",",
colClasses=col.classes,
comment.char="",
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
有了这个,文件的读取速度比不指定列类要快得多。不过,最好所有列都正确分类。
有什么见解吗?
谢谢
【问题讨论】:
-
提示 - 使用来自
data.table的fread,您不必担心这些,而且速度更快。 -
这个问题有点奇怪。我在这里最好的猜测是,在第一个非整数数字弹出之前的相当长一段时间内,相应的列都包含整数——尽管没有数据,这是无法分辨的。您可以通过将
col.classes中的整数替换为数字(如您所做的那样)或从头开始读取整个 csv 来解决此问题。确实,有些包还是提供了更好的方法,那你为什么要read.csv?