【问题标题】:Warnings of "NAs introduced by coercion" in fread functionfread 函数中“强制引入的 NA”的警告
【发布时间】:2019-04-30 20:33:42
【问题描述】:

我正在尝试使用 fread() 读取 2 列 (x, y) 和约 3 亿行 (62 GB) 的表,并在散点图中绘制 x 和 y。我正在使用“fread”,如果我只使用一小部分数据,比如 30000 行,它就可以正常工作。

但如果我在整个数据集上运行它,我得到:
“警告信息: 在 setattr(ans, "row.names", .set_row_names(nr)) : 通过强制引入整数范围的 NA /var/spool/torque/mom_priv/jobs/11244921.cri16sc001.SC: line 14: 70765 Killed Rscript 10_plotZ0Z1.R"

可能是什么原因?

【问题讨论】:

  • 好吧,不管fread() 错误如何,如果您尝试在不使用散点图平滑图表的情况下绘制它,它很可能会失败。对于基本的 R 图形来说,这点太多了(真的太多了)。你有多少系统内存?即使使用基本 R 图形,您也需要一个 62GB 以上的大量缓冲区来绘制全部数据,尤其是如果您使用 ggplot2 进行尝试。
  • @hrbrmstr 我正在使用集群,目前有 65 GB 内存。如何使散点图平滑?
  • 谢谢,所以我实际上是使用readLines(con, n=1) 逐行读取表格并使用points() 逐点绘制它。它现在似乎可以工作了。

标签: r data.table large-data large-files fread


【解决方案1】:

您可以按照 cmets 中的建议对您的大文件进行采样。不幸的是,fread 似乎还没有实现这样的功能 - 请参阅this opened issue(支持该功能可以激励开发人员致力于它)。但是正如here 所提到的,如果你在Linux 上,那么试试shuf -n shell 命令:

library(data.table)

# Generate some random data
dt <- data.table(x = rnorm(10^6), y = rnorm(10^6))
# write to csv file
fwrite(dt, "test-dt.csv")

# Read a random sample of 10^5 rows
dt2 <- fread(cmd = "shuf -n 100000 test-dt.csv")
dt[, plot(x,y)]

或者,您可以通过多次调用fread 从文件中读取行块,如here 所示。

【讨论】:

  • 谢谢!我认为发生 NAs 错误是因为我有一个标题行也被读入表中,但我没有先注意到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多