如果限于本地机器,最好使用 R 和 SQL

Best use of R and SQL if restricted to a local machine

我正在努力改进我的工作流程,并希望社区能够提供见解,因为我对“大数据”还比较陌生。

我通常从 public 来源下载多个数据帧,这些数据帧可能相互关联。在拉取几个数据帧后,我在对最终数据集进行回归分析之前执行各种数据处理步骤(例如,过滤、排序、聚合、自定义计算)and/or 其他推断统计。

具体来说,您会推荐哪种策略:

  1. 将所有数据作为单独的文件从网上下载到我的本地机器上,然后使用 R 直接处理它(就像我一直在做的那样)。我看到的潜在问题是一切都在 R 的工作环境中,这可能会减慢进程并使我的机器崩溃。

  1. 将所有数据作为单独的文件从 Web 下载到我的本地机器上,在本地机器上使用 sqldf 创建数据库,并使用 sqldf 的后续查询来拉取和在 R 中进行最终数据分析之前从该数据库聚合信息。我看到的潜在问题是,在我的本地机器上用 sqldf 创建的由少数 tables/dataframes 组成的数据库更大比简单地保存几个单独的 .csv 文件大。

我非常熟悉统计技术,但在数据库管理和服务器操作方面,我承认存在一些知识空白。作为一种语言,我已经熟悉 SQL 的具体细节,并且我知道如何在 R 工作环境中使用 sqldf 和数据帧 运行ning。但是,坦率地说,与仅学习如何使用基本 R 函数来过滤、排序和聚合数据相比,我不知道它有什么优势。此外,我已经阅读了一些关于将 SQL 服务器与 R 配对的炒作的网页,但我不确定这对我来说是否是一个好的选择,因为我 运行 一切都在本地。

关于如何通过将 R 与 SQL 的某些实现相结合来改进我的数据处理和分析的任何提示?

提前致谢!

这在很大程度上取决于您环境的基础架构,但在 "Big Data" 的世界中,我建议同时使用两者,因为每个都有难以放弃的优势。

大多数数据清理和操作操作都可以在两个平台上执行,有些以性能为代价,有些以资源为代价。

内存中: R 的环境主要在 RAM 中。这要快得多,但并不总是必要的。如果你有一个 100 GB 的数据集,将它加载到 RAM 中是不可行的。大多数数据库已经引入了内存中的 tables,因此如果您希望更快地访问特定的 tables,那么您可以随时将它们加载到 RAM 中。

索引和分区: 与通过 CSV 文件相比,在数据库上查询已被有效索引和分区的数据要容易得多。大多数探索性分析是在分区或数据集群上完成的,放弃它是一个巨大的性能折衷。

下载和存储: 在 R 中很容易编写用于下载数据并将其上传到数据库的脚本。在数据库上,可以更轻松地存储数据以实现快速访问,也可以有效地压缩数据以提高性能和可扩展性。

Table 观看次数: 您可能希望存储许多数据集或对数据集的基本操作以备后用。在数据库中,您可以使用 table 视图,这些视图可以跨任意数量的 table 连接和操作数据。为了在 R 中获得相同的结果,您必须加载所有相关的 table 并在每次您想要访问相同数据时执行合并和操作。

分析: 这就是 R 的创建目的。许多数据库甚至无法执行最基本的分析,因此我会将所有统计分析留在 R 中。

我敢肯定还有更多 advantages/disadvantages 可以在 R 和使用数据库之间进行比较。 同样,如果您只是为了好玩而处理少量数据,则可以一直使用 R。否则,请同时使用两者。 table.

更简单、更快捷、更舒适

要事第一。 sqldf 不是数据库,它是一个包,允许您以 SQL 语法操作 data.frame 对象。好吧,准确地说,它在后端使用 SQLite,但你不应该将 sqldf 包视为数据库。

sqldf 是一个很好的方便的包。在某些情况下,它也可能有效,但有效性不是其主要目标。我建议您考虑 data.table 套餐。它专为提高效率而设计,其性能可能会让您大吃一惊。

选择策略的首要建议如下:尊重权衡因素!使用 R 部署实际的 SQL 数据库可能会给您带来巨大的优势,但它会在开发过程中增加大量开销。这完全取决于项目的范围。没有一般规则,但我可以尝试指出一些经验法则。

  • 默认情况下,我会尽量避免涉及 SQL 数据库,除非我面对 SQL 的项目特定参数。

  • 如果瓶颈是 RAM 并且 R 仅对聚合数据是必需的,那么您真的应该考虑使用 SQL 数据库。例如,MySQL 将负责分页、缓存和多线程——这可能是重要的参数。

  • 如果不同来源的数据结构有显着差异,那么使用 SQL 会增加额外的开销,因为您必须在 R 和 SQL 中管理它 - 尝试避免那个。另一方面,如果有很多具有相同数据结构的源,那么数据库会给你很好的改进。

  • 如果只需要处理源数据,处理文件就OK了。但是如果你需要重复运行它并保存所有的输出、更改、版本等等,那么数据库就成了必需品。

这只是我的拙见。

鉴于您正在寻找 "workflow best practices",可再现性透明度 都应该有很高的溢价].由于您的目标是数据分析而不是数据收集或数据库管理,因此没有充分的理由创建您自己的数据库,自定义数据库可能会使您的工作流程和分析不那么透明。 总之,不需要建数据库就不用。

听起来您的工作流程如下:

  1. 从 public 来源下载数据(最好是 .csv 或类似的好格式)
  2. 清理和处理数据
  3. 运行 对(潜在链接的)清理数据的分析

我建议将您的工作流程分为两个不同的步骤:

1。下载并清理数据

如果您的文件都是 .csv(或其他常规分隔文件),那么此步骤只需要 data.table 包。您可以编写单个 R 脚本来下载、清理和保存您需要的数据。下面是一个最小的例子:

# Download data
library(data.table)
salary_data <- fread('https://data.phila.gov/api/views/25gh-t2gp/rows.csv')

# Clean data (only looking at City Council salaries)
cleaned_data <- salary_data[Department == 'CITY COUNCIL']

# Saving cleaned data
save(cleaned_data, file = 'my_file_name.rda', compress = TRUE)

理想情况下,您只需 运行 此文件一次即可生成您实际执行统计分析的数据集。如果您决定以不同方式清理或处理您的数据,只需重新访问此文件,进行适当的更改,然后重新运行。我建议为您正在下载的每个文件准备一个脚本,这样就可以很容易地看到您是如何直接从源 (transparency) 处理原始数据的。简单地让这个文件满足 reproducibility.

2。统计分析

如果您需要合并数据集,data.table 提供了一种快速且透明的方法。只需加载您清理过的个人数据集,确定您将用于合并它们的密钥,然后合并它们。然后 运行 您对合并数据集的分析。下面是此功能的示例:

# dt1 has salary information for 10 people and dt2 
# has the number of kids for the same 10 people
library(data.table)
dt1 <- data.table(id = 1:10, salary = sample(0:100000, 10)
dt2 <- data.table(id = 1:10, kids = sample(0:5, 10)
save(dt1, file = 'dt1.rda', compress = TRUE)
save(dt2, file = 'dt2.rda', compress = TRUE)

# Loading and merging data
load(file = 'dt1.rda')
load(file = 'dt2.rda')
setkey(dt1, id)
setkey(dt2, id)
merged_dt <- merge(dt1, dt2)

# Doing regression analysis on merged data
reg <- lm(salary ~ kids, data = merged_dt)

这使得合并过程和后续分析透明可重现

总结

此过程可确保您的数据源、数据 cleaning/processing 和分析记录完备、透明且可重现。此外,此过程可根据您的计算机进行扩展。如果不需要建数据库,那就不用。

如果数据对我的电脑来说太大了怎么办?如果你需要更多space,只需运行你已经编写的代码专用服务器或亚马逊网络服务机器。

如果数据对于专用服务器来说太大怎么办?数据很可能存储在实际数据库中,唯一改变的工作流程是数据下载并且(可能)一些处理将是对数据库的 SQL 查询(最有可能使用 DBI 包,其中 运行s SQL 在 R 中查询),然后应该足够小 运行 在本地或专用服务器上。

如果我的数据太大了怎么办?您可能应该研究更多重型大数据语言,例如 Hadoop。

补充说明:如果您的数据不是常规分隔格式(例如 Excel、SAS 或 Stata 文件),那么我建议使用download_file() 函数与 tidyverse 包相结合(它具有阅读这些不太令人愉快但常见的文件的奇妙能力)

library(tidyverse)
taxi_data_excel <- download.file(url = 'http://www.nyc.gov/html/tlc/downloads/excel/current_medallion_drivers.xls', destfile = 'taxi_data_excel.xls')
taxi_data <- read_excel('taxi_data_excel.xls')

然后照常打扫。