《高效R语言编程》6--高效数据木匠

将你的数据整理好是一个可敬的、某些情况下是至关重要的技能,所以作者使用了数据木匠这个词。这是本书最重要的一章,将涉及以下内容:

  • 使用tidyr整理数据
  • 使用dplyr处理数据
  • 使用数据库
  • 使用data.table处理数据

软件配置

library("tibble")
library("tidyr")
library("stringr")
library("readr")
library("dplyr")
library("data.table")

高效的tibble包

tibble定义了新的数据框,更加易用。

  • tibble会打印每个变量的类,data.frame不会
  • stringAsFactors默认不转换
  • 输出时,只输出前10行

使用tidyr与正则表达式整理数据

整理数据包括数据清理和数据重构,前者是重定格式与标记脏数据,stringi和stringr可以通过正则表达式更新脏字符串,assertive和assertr包可以在数据分析项目的一开始进行数据完整性的校验。通常的数据清理是将非标准文本字符串转换成lubridate简介所描述的数据格式。
vignette("lubridate")


整洁是个广泛的概念,也包括重构数据,以便有利于数据分析和建模。R语言运行几个长列比运行一些短列快,所以一般认为宽数据(不整洁),长数据(整洁)。

tidyr方便了收集与分割两个常见的操作

gather()收集是将列名换成新变量,将宽表变成长表,spread()是实现相反过程的函数。
用法是:gather(data,key,value,-religion),分别是数据框,要转换成分类的列名,单元值的列名和清除收集的变量

使用seperate()分割联合变量

分割是指将一个实际由两个变量组成的变量分割成两个独立列

library(tidyr)
agesex <- c("m0-10","f0-10")
n <- c(3,5)
agesex_df <- tibble(agesex,n)
# A tibble: 2 x 2
  agesex     n
  <chr>  <dbl>
1 m0-10      3
2 f0-10      5
separate(agesex_df,col=agesex,into=c("age","sex"))
# A tibble: 2 x 3
  age   sex       n
  <chr> <chr> <dbl>
1 m0    10        3
2 f0    10        5

其他tidyr函数

broom包提供了模型结果的标准输出格式bit.ly P.s,不知道为啥,这网站还得过墙,难道这是架设在了谷哥的服务器上。


使用broom::tidy()广泛应用于模型数据,并以标准数据框格式返回模型输出。使用变量名非标准化求值更高效,见R语言 dplyr传递参数_自由 平等~忠诚 奉献-CSDN博客。只是函数名多了个下划线那么简单吗?

正则表达式

R与stringr分别使用grepl()和str_detect()来进行,我比较喜欢基础R的,不知你喜欢安装包还是用基本的。

使用dplyr高效处理数据

这个包名的意思是数据框钳,相比基础R的优点是运行更快、与整洁数据和数据库配合好。函数名的部分灵感来自SQL。



与基本R中类似函数不同,变量无需使用$操作符就可直接使用,设计与magrittr包的%>%管道操作符一起使用,以允许每个数据阶段写成新的一行。其是一个大型包,本身可以捍成一门语言。

列改名

rename(),使用反引号‘`’包裹,允许R使用不规范的列名。

改变列的分类

R对象的类是性能的关键,as.numeric()、data.matrix()等改变类,或者vapply(data, class,chracter(1))。 unlist()函数的作用,就是将list结构的数据,变成非list的数据,即将list数据变成字符串向量或者数字向量的形式。

滤除行

filter()

键操作

数据聚合

基于组合变量生成数据汇总,以前称为split-apply-combine。summarize是一个多面手,用于返回自定义范围的汇总统计值。

非标准计算

代码中没有引号包裹的原始名字,这种方式叫做非标准计算(NSE),高效交互使用函数,减少键盘输入,允许Rstudio中自动完成。还是函数名多个_。

合并数据集

# 安装包
install.packages("ggmap","maps")
library(ggmap)
world <- map_data("world")
names(world)
# [1] "long"      "lat"       "group"     "order"     "region"   
[6] "subregion"

使用数据库

R会把所有数据加载到内存中,数据库是从硬盘中获取数据的。RODBC是一个资深包,提供R与SQL server的接口。DBI包提供了通用接口与驱动程序的类集,如RSQLITE,是访问数据库的统一框架,允许其他驱动程序以模块包添加。
这里建议不要把数据库密码和API密钥等放在命令中,而要放大.Renviron文件中。
dbConnect()函数连接数据库,dbSendQuery()查询,dbFetch()加载到R中。
mongolite包可以连接MongoDB,MonetDB也可以。

数据库与dplyr

必须使用src_*()函数创建一个数据源。

使用data.table()处理数据

是dplyr的替代,两个哪个好存在争议,最好学一个一直坚持下去。如果两个都是新手,推荐dplyr。为了提升性能,可以设置键,类似数据库的主键,方便二进制算法提取目标子集行。


不同包的性能比较图
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容