如果仅限于本地计算机,则最好使用R和SQL

Jay*_*ron 22 sql database sql-server r sqldf

我正在努力改进我的工作流程,并希望社区可以提供见解,因为我对"大数据"相对较新.

我通常从公共来源下载几个可以相互关联的数据帧.在提取了几个数据帧之后,我会在对最终数据集进行回归分析和/或其他推论统计之前,执行各种数据处理步骤(例如,过滤,排序,聚合,自定义计算).

具体而言,您会推荐哪种策略:

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

要么

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

我对统计技术非常熟悉,但我确实在数据库管理和服务器操作方面存在一些知识空白.我熟悉SQL的基本要素,作为一种语言,我知道如何使用sqldf在R工作环境中运行的数据帧.但是,我坦率地不知道它提供了什么优势,而不仅仅是学习如何使用基本R函数来过滤,排序和聚合数据.另外,我已经阅读了一些关于将SQL Server与R配对的大肆宣传的网页,但我不确定这对我来说是否是一个不错的选择,因为我在本地运行所有内容.

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

先感谢您!

小智 9

鉴于您正在寻找"工作流程最佳实践",因此应重新考虑可重复性透明度.由于您的目标是数据分析而不是数据收集或数据库管理,因此没有充分理由创建自己的数据库,而自定义数据库可能会使您的工作流程和分析变得不那么透明.简而言之,如果您不需要构建数据库,请不要.

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

  1. 从公共来源下载数据(理想情况下.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)
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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

摘要

此过程可确保您的数据源,数据清理/处理和分析具有良好的文档记录,透明和可重现性.此外,此过程可与您的计算机一起扩展.如果您不需要构建数据库,那么请不要.

如果数据对我的电脑来说太大怎么办?如果您需要更多空间,只需运行您已在专用服务器或Amazon Web Services计算机上编写的代码.

如果数据对于专用服务器来说太大会怎么样?有可能数据存储在一个实际的数据库中,而改变的工作流程中唯一的部分就是数据下载和(可能)某些处理将是对数据库的SQL查询(最有可能使用DBI运行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')
Run Code Online (Sandbox Code Playgroud)

然后像往常一样进行清洁.


Vyg*_*yga 6

首先要做的事情.sqldf它不是一个数据库,它是一个允许您data.frame在SQL语法中操作对象的包.嗯,确切地说,它SQLite在后端使用,但您不应该将sqldf包视为数据库.

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

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

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

  • 如果瓶颈是RAM而R只是聚合数据需要,那么你应该考虑使用SQL数据库.例如,MySQL将负责分页,缓存和多线程 - 这可能是重要的参数.

  • 如果不同源的数据结构存在显着差异,那么使用SQL会增加额外开销,因为您必须在R和SQL中管理它 - 尽量避免这种情况.另一方面,如果有很多具有相同数据结构的源,那么数据库将为您提供良好的改进.

  • 如果您只需要继续源数据,那么处理文件就可以了.但是如果你需要重复运行并保存所有输出,更改,版本等,那么数据库就变得必不可少了.

这只是我的拙见.


AYR*_*AYR 5

它在很大程度上取决于您的环境的基础设施,但在"大数据"的世界中,我建议使用两者,因为每个都有难以放弃的优势.

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

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

索引和分区: 通过CSV文件查询已在数据库上高效索引和分区的数据更容易.大多数探索性分析是在分区或数据集群上完成的,并且这是一个巨大的性能权衡.

下载和存储: 在R中,编写用于下载数据并将其上载到数据库的脚本非常容易.在数据库上,可以更轻松地存储数据以便快速访问,并且可以有效地压缩数据以提高性能和可伸缩性.

表视图: 您希望存储以供以后使用的数据集上有许多数据集或基本操作.在数据库中,您可以使用表视图,该表视图可以跨任意数量的表连接和操作数据.为了在R中获得相同的结果,您必须加载所有相关表,并在每次要访问相同数据时执行合并和操作.

分析: 这就是R的基础.许多数据库使得甚至无法执行最基本的分析,因此我将所有统计分析留在R中.

我确信在R和使用数据库之间可以比较更多的优点/缺点.同样,如果您正在处理少量数据以获得乐趣,您可以一直使用R. 否则,使用两者.它更容易,更快速,更舒适.