【R语言数据科学】:(五)data.table库(数据处理)-灵析社区

秋叶无缘

R语言数据科学

参考资料: Data Analysis and Prediction Algorithms with R

5.data.table

data.table库是用于数据整理和分析的,在第三章中我们介绍了dplyr包来进行数据处理。本章介绍在data.table中如何实现相同的功能

5.1 操作数据表

data.table是一个单独的库。需要单独安装导入。本章介绍一些与第三章:R语言数据处理相关的方法: mutate,filter,select,group_by

首先我们使用setDT函数将数据框装换为一个data.table,否则 后面的操作可能会失效

library(tidyverse)
library(data.table)
library(dslabs)
murders <- copy(murders)
murders <- setDT(murders)

5.1.1 selecting

对数据进行选择指定列,在使用dplyr时,我们是这样写的

select(murders, state, region) %>% head()
stateregion
<chr><fct>
AlabamaSouth
AlaskaWest
ArizonaWest
ArkansasSouth
CaliforniaWest
ColoradoWest

下面我们演示一下在data.table中是如何使用的

murders[, c('state', 'region')] %>% head()
stateregion
<chr><fct>
AlabamaSouth
AlaskaWest
ArizonaWest
ArkansasSouth
CaliforniaWest
ColoradoWest

也可以直接使用.()来进行访问相应变量

murders[,.(state, rate)] %>% head()
staterate
<chr><dbl>
Alabama0.2824424
Alaska0.2675186
Arizona0.3629527
Arkansas0.3189390
California0.3374138
Colorado0.1292453

5.1.2 添加一列或者改变一列

我们在dplyr中使用mutate函数

murders %>% mutate(murders, rate = total / population * 10^5) %>% head()
stateabbregionpopulationtotalrate
<chr><chr><fct><dbl><dbl><dbl>
AlabamaALSouth47797361352.824424
AlaskaAKWest710231192.675186
ArizonaAZWest63920172323.629527
ArkansasARSouth2915918933.189390
CaliforniaCAWest3725395612573.374138
ColoradoCOWest5029196651.292453

在data.table中,我们使用:=来定义新的一列,这样能节约电脑内存

murders[, rate := total/population * 10 ^5] %>% head()
stateabbregionpopulationtotalrate
<chr><chr><fct><dbl><dbl><dbl>
AlabamaALSouth47797361352.824424
AlaskaAKWest710231192.675186
ArizonaAZWest63920172323.629527
ArkansasARSouth2915918933.189390
CaliforniaCAWest3725395612573.374138
ColoradoCOWest5029196651.292453

同样我们可以使用:=定义多个列

murders[, ':='(rate=total / population * 10000, rank = rank(population))] %>% head()
stateabbregionpopulationtotalraterank
<chr><chr><fct><dbl><dbl><dbl><dbl>
AlabamaALSouth47797361350.282442429
AlaskaAKWest710231190.26751865
ArizonaAZWest63920172320.362952736
ArkansasARSouth2915918930.318939020
CaliforniaCAWest3725395612570.337413851
ColoradoCOWest5029196650.129245330

5.1.3 引用和复制

data.table包的设计是为了避免浪费内存。因此我们可以复制一个表

x <- data.table(a=1)
y <- x

y实际是x的引用,而不是一个新对象,相当于是x的另一个名字。只有当改变y的时候,才会生成一个新对象 然而在使用:=函数是,即便改变x也不会生成一个新的y对象,有时候我们不希望改变原来的对象,此时需要用copy()函数

x [,a:=2]
y
a
<dbl>
2
z = copy(x)
x[,a:=3]
z
a
<dbl>
1

5.1.4索引

dplyr中,我们通过下述代码过滤

filter(murders, rate <= 0.7) %>% head()
stateabbregionpopulationtotalraterank
<chr><chr><fct><dbl><dbl><dbl><dbl>
AlabamaALSouth47797361350.282442429
AlaskaAKWest710231190.26751865
ArizonaAZWest63920172320.362952736
ArkansasARSouth2915918930.318939020
CaliforniaCAWest3725395612570.337413851
ColoradoCOWest5029196650.129245330

在data.table中,我们可以直接使用索引

murders[rate<=0.7,.(state, rate)] %>% head()
staterate
<chr><dbl>
Alabama0.2824424
Alaska0.2675186
Arizona0.3629527
Arkansas0.3189390
California0.3374138
Colorado0.1292453

5.2 数据描述性统计

和第三章一样,我们使用heights数据集为例

data(heights)
# 将数据转换为data.table对象
heights <- setDT(heights)

在data.table中,我们可以使用.()函数来直接访问相应的变量。因此我们可以在原来dplyr中简化代码如下

s <- heights[, .(average = mean(height), standard_deviation = sd(height))]
s
averagestandard_deviation
<dbl><dbl>
68.323014.078617

下面假设我们要查询女性的平均身高和标准差

s <- heights[sex == 'Female', .(avg = mean(height), standard_deviation = sd(height))]
s
avgstandard_deviation
<dbl><dbl>
64.939423.760656

5.2.1 多个描述性统计指标

还记得在第三章中,我们定义了如下函数

median_min_max <- function(x){
    qs <- quantile(x, c(0.5,0,1))
    data.frame(median=qs[1], min = qs[2], max = qs[3])
}
heights[,.(median_min_max(height))]
medianminmax
<dbl><dbl><dbl>
68.55082.67717

5.2.2 分组统计

在dplyr中我们使用group_by来进行分组,在data.table中,我们使用by进行分组

heights[,.(avg = mean(height), standard_deviation=sd(height)), by = sex]
sexavgstandard_deviation
<fct><dbl><dbl>
Male69.314753.611024
Female64.939423.760656

5.3 对数据排序

我们可以使用与筛选相同的方法对行进行排序。以下是按谋杀率排序的州:

murders[order(population)] %>%  head()
stateabbregionpopulationtotalraterank
<chr><chr><fct><dbl><dbl><dbl><dbl>
WyomingWYWest56362650.088711311
District of ColumbiaDCSouth601723991.645275322
VermontVTNortheast62574120.031962113
North DakotaNDNorth Central67259140.059471514
AlaskaAKWest710231190.267518605
South DakotaSDNorth Central81418080.098258376


阅读量:2019

点赞量:0

收藏量:0