微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 read.csv 得到错误的类?

如何解决为什么 read.csv 得到错误的类?

我必须读取一个大的 .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

有了这个,文件的读取速度比不指定列类要快得多。不过,最好是所有列都正确分类

有什么见解吗?

谢谢

解决方法

我怀疑您的行样本中的某些列仅包含整数,但在行样本之外它们包含非整数,我怀疑您是正确的。这是大文件的常见问题。您需要增加行样本大小,或者为出现这种情况的某些列明确指定列类型。

需要注意的是,readrread_csv 会自动进行此行采样。来自文档:“所有列类型都将从输入的前 1000 行进行插补。这很方便(且快速),但不可靠。如果插补失败,您需要自己提供正确的类型。”你可以这样做:

read_csv( YourPathName,col_types = cols(YourProblemColumn1 = col_double(),YourProblemColumn2 = col_double())
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。