理论问题:Data.table vs Data.frame with Big Data

数据挖掘 r 数据框 dplyr 数据表
2022-03-03 13:06:22

我知道使用该读取一个非常大的csv文件比使用. 但是,只能对 执行操作freaddata.tableread.csvdata.framedplyrdata.frame

我的问题是:

  1. 为什么dplyr要使用这两种数据结构中较慢的一种?
  2. 在处理大数据时,读取data.table并转换data.frame为执行dplyr操作是一种好习惯吗?
  3. 我还缺少另一种策略吗?
2个回答
  1. 它们是独立开发的。他们服务(并继续服务)不同的目的。此外,在早期,data.table 很难实际编程(而不是交互式使用)。有关详细比较,请参见此处
  2. 不。如上面的注释中所述,data.table::fread使用 dtplyr,然后使用 dtplyr 对data.table对象进行有效的 dplyr 操作。
  3. 往上看。

我使用 data.table 来处理内存中数 GB 和超过 10 亿行的数据集。我在 dplyr 上没有取得同样的成功。

此外,请注意 dtplyr 自述文件中的注释:

dtplyr 总是比 data.table 慢一点,因为它创建对象的副本而不是就地变异(这就是 dplyr 的理念)。目前,dtplyr 比裸 data.table 慢很多,因为这些方法不够聪明。我希望社区中感兴趣的 dplyr 和 data.table 用户能帮助我提高性能。

tidyverse 还包含readr用于读取文本文件的更快功能,例如read_csvhttps://cran.r-project.org/web/packages/readr/README.html)。

您在这里混淆了两个问题,data.table 与 data.frame 的操作速度,以及读取此类数据。

我会冒险猜测read.csv并且read.table速度很慢,因为它会进行很多低效的猜测并且(默认情况下)尝试将字符串转换为因子。在处理大型数据集时,您应该总是更喜欢告诉例程它正在读取什么,而不是让它猜测。

最后,如果您正在处理非常大的数据集,假设您的数据是结构化的,那么在 Rcpp 等中实现的专用子例程可能会更可取。