R语言 可扩展数据处理
大多数时候,R程序员会遇到大数据导致的问题,因为默认情况下变量是存储在内存中的。R语言在处理大于计算机内存10%的海量数据时并不顺利。但是,如果我们想在数据科学领域取得优异成绩,数据处理应该是可扩展的。因此,我们将讨论当数据充分大于计算机的RAM时,我们如何应用某些操作并轻松使用可扩展的数据处理。讨论也将集中在处理’Äúout of core’ÄĚ对象上。
什么是可扩展的数据处理?
可扩展性 是一个非常重要的方面,当大数据进入画面时。正如我们所知,在磁盘中读写数据比在RAM中读写数据需要更多时间。正因为如此,当我们需要从硬盘中检索一些数据时,与RAM相比,需要花费很多时间。计算机的资源,如RAM、处理器和硬盘,在决定我们的R代码的执行速度方面起着重要作用。我们知道,我们不能改变这些资源(除了用新的硬件替换它们),但我们可以以有效的方式利用这些资源。
例如,让我们考虑我们有一个与RAM大小相等的数据集。通过只加载我们目前实际需要的那部分数据集,可以减少成本。
处理时间与数据大小之间的关系
处理时间取决于数据集的大小。较大的数据集一般需要较长的时间来处理。但需要注意的是,处理时间与数据集的大小不成正比。
让我们通过一个例子来简单了解。假设我们有两个数据集,其中一个的大小是另一个的两倍。因此,处理较大的数据集所需的时间不是处理另一个数据集所需时间的两倍。
大数据集的处理时间显然会比小数据集多,但我们不能明确地说,它将是小数据集的两倍或三倍等等。这完全取决于对数据集元素进行的操作。
R为我们提供了一个微基准测试包,可以用来比较两个或多个操作的时间。我们还可以使用R中的plot()函数绘制差异。
示例
例如,考虑以下程序,对不同大小的随机数组进行排序 ‘ąí
# Load the microbenchmark package
library(microbenchmark)
# Time comparison between sorting vectors of
# different sizes
microbenchmarkObject <- microbenchmark(
# Sort a random normal vector length 5e5
"5e5" = sort(rnorm(5e5)),
# Sort a random normal vector length 4e5
"4e5" = sort(rnorm(4e5)),
# Sort a random normal vector length 3e5
"3e5" = sort(rnorm(3e5)),
# Sort a random normal vector length 2e5
"2e5" = sort(rnorm(2e5)),
# Sort a random normal vector length 1e6
"1e6" = sort(rnorm(1e6)),
times = 15
)
# Plot the resulting benchmark object
plot(microbenchmarkObject)
输出
正如你在输出中所看到的,每次的执行时间并不一样。其原因是,当系统执行R代码时,其他事情也在暗中进行。
注意 在评估R代码的执行时间时,使用微基准库跟踪操作也是一种好的做法。
与 “非核心 “对象一起工作
在本节中,我们将讨论big.matrix对象。big.matrix包括R中的一个对象,其作用与C++中的数据结构差不多。这个对象看起来就像一个通用的R矩阵,但却能防止开发者遇到通用R矩阵的内存消耗问题。
现在我们将使用read.big.matrix()函数创建我们自己的big.matrix对象。
这个函数也和read.table()很相似,但是它要求我们指定我们要读取的值的类型,即’Äúchar’ÄĚ, ‘Äúshort’ÄĚ, ‘Äúinteger’ÄĚ, ‘Äúdouble’ÄĚ。必须给出存放矩阵数据的文件名(备份文件),它需要存放矩阵信息的文件名(描述符文件)。结果将被存储在磁盘上的一个文件中,该文件保留了读取的数值,并有一个描述符文件,保留了关于所产生的big.matrix对象的更多描述。
安装bigmemory库
在进一步行动之前,我们需要安装’Äúbigmemory’ÄĚ库。你可以使用CRAN中的以下命令下载这个库,’ąí
install.packages("bigmemory")
导入bigmemory
第一步是导入 bigmemory 库。使用下面的命令导入该库’ąí
library(bigmemory)
下载文件
现在下载一个样本csv文件 “mortgage-sample.csv” ‘ąí
# Download file using URL
download.file("http://s3.amazonaws.com/assets.datacamp.com/production/course_2399/datasets/mortgage-sample.csv", destfile = "mortgage-sample.csv")
创建big.matrix对象
我们现在将创建一个big.matrix的对象。为此,传递的参数将是’Äúmortgage-sample.desc’ÄĚ。该对象的维度可以通过dim()函数来提取,’ąí
示例
# Create an object of
object <- read.big.matrix("mortgage-sample.csv", header = TRUE, type = "integer",
descriptorfile = "mortgage-sample.desc")
# Display the dimensions
dim(object)
输出
[1] 70000 16
正如你在输出中看到的,big.matrix对象的尺寸已经显示出来了。
显示big.matrix对象
为了显示前6行,我们可以使用head()函数 ‘ąí
示例
head(object)
输出
enterprise record_number msa perc_minority
[1,] 1 566 1 1
[2,] 1 116 1 3
[3,] 1 239 1 2
[4,] 1 62 1 2
[5,] 1 106 1 2
[6,] 1 759 1 3
tract_income_ratio borrower_income_ratio
[1,] 3 1
[2,] 2 1
[3,] 2 3
[4,] 3 3
[5,] 3 3
[6,] 3 2
loan_purpose federal_guarantee borrower_race
[1,] 2 4 3
[2,] 2 4 5
[3,] 8 4 5
[4,] 2 4 5
[5,] 2 4 9
[6,] 2 4 9
co_borrower_race borrower_gender
[1,] 9 2
[2,] 9 1
[3,] 5 1
[4,] 9 2
[5,] 9 3
[6,] 9 1
co_borrower_gender num_units affordability year
[1,] 4 1 3 2010
[2,] 4 1 3 2008
[3,] 2 1 4 2014
[4,] 4 1 4 2009
[5,] 4 1 4 2013
[6,] 2 2 4 2010
type
[1,] 1
[2,] 1
[3,] 0
[4,] 1
[5,] 1
[6,] 1
创建表格
我们也可以创建一个表格。样本csv文件包含年份作为列名,所以我们可以用以下程序显示抵押贷款的数量’ąí
示例
# Create a table for the number
# of mortages for each specific year
print(table(object[, "year"]))
输出
2008 2009 2010 2011 2012 2013 2014 2015
6919 8996 7269 6561 8932 8316 4687 5493
正如你在输出中看到的,每个特定年份的抵押贷款数量已经显示出来。
数据摘要
现在我们已经学会了如何导入一个big.matrix对象。现在我们将看到如何分析存储在该对象中的数据。R为我们提供了binanalytics包,我们可以用它来创建摘要。你可以使用CRAN中的以下内容下载biganalytics库 ‘ąí
install.packages("biganalytics")
示例
现在让我们考虑以下程序,显示抵押贷款的摘要’ąí
library(biganalytics)
# Download file using URL
download.file("http://s3.amazonaws.com/assets.datacamp.com/production/course_2399/datasets/mortgage-sample.csv",
destfile = "mortgage-sample.csv")
# Create an object of
object <- read.big.matrix("mortgage-sample.csv",
header = TRUE,
type = "integer",
descriptorfile = "mortgage-sample.desc")
# Display the summary
summary(object)
输出
enterprise 1.0000000 2.0000000 1.3814571 0.0000000
record_number 0.0000000 999.0000000 499.9080571 0.0000000
msa 0.0000000 1.0000000 0.8943571 0.0000000
perc_minority 1.0000000 9.0000000 1.9701857 0.0000000
tract_income_ratio 1.0000000 9.0000000 2.3431571 0.0000000
borrower_income_ratio 1.0000000 9.0000000 2.6898857 0.0000000
loan_purpose 1.0000000 9.0000000 3.7670143 0.0000000
federal_guarantee 1.0000000 4.0000000 3.9840857 0.0000000
borrower_race 1.0000000 9.0000000 5.3572429 0.0000000
co_borrower_race 1.0000000 9.0000000 7.0002714 0.0000000
borrower_gender 1.0000000 9.0000000 1.4590714 0.0000000
co_borrower_gender 1.0000000 9.0000000 3.0494857 0.0000000
num_units 1.0000000 4.0000000 1.0398143 0.0000000
affordability 0.0000000 9.0000000 4.2863429 0.0000000
year 2008.0000000 2015.0000000 2011.2714714 0.0000000
type 0.0000000 1.0000000 0.5300429 0.0000000
输出显示了通过指定最小、最大、平均和NA值的对象的摘要。
结论
在本教程中,我们讨论了R语言中的可扩展数据处理。我们看到了像big.matrix这样的 “非核心 “对象的工作。我希望通过本教程你能获得R语言中可扩展数据处理的知识,从数据科学的角度来看,这是非常重要的。