【问题标题】:Why is read.csv getting wrong classes?为什么 read.csv 得到错误的类?
【发布时间】: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.tablefread,您不必担心这些,而且速度更快。
  • 这个问题有点奇怪。我在这里最好的猜测是,在第一个非整数数字弹出之前的相当长一段时间内,相应的列都包含整数——尽管没有数据,这是无法分辨的。您可以通过将col.classes 中的整数替换为数字(如您所做的那样)或从头开始读取整个 csv 来解决此问题。确实,有些包还是提供了更好的方法,那你为什么要read.csv

标签: r dataframe csv read.csv


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2017-01-10
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 2021-12-25
    相关资源
    最近更新 更多