《高效R语言编程》5-高效输入输出

在读取一行数据之前,应该先考虑下重复数据管理的通用规则,不改写原始数据。原始文件视为只读,保留原始文件名字并说明来源,是一个好办法。

软件配置

几个包:

install.packages(c("rio","readr","data.table","feather","WDI"))

关于数据I/O的高级技巧

  • R语言自己的文件格式是.Rds,可以使用readRDS()与saveRDS()函数导入与导出,是一种速度与空间存储都什么高效的格式。
  • 使用rio包的import()能导入各种格式的数据,避免加载特定格式库的麻烦。
  • 对于高效导入大文本文件,使用readr或data.table与read.table()相当。
  • 使用file.size()与object.size()跟踪文件与R对象的大小,以便在过大之前提前预防。

使用rio的通用数据导入

多功能包,名副其实,提供简单易用和计算高效的函数,其目标是简化数据导入导出过程。R的数据导入导出手册中有些函数已经过时了,比如WriteXLS包,且很难学习。
rio包可以处理的格式包含:.csv, .feather, .json, .dta, .xls, .xlsx和谷歌在线表格。其无需指定可选的format参数,另外可以从网络下载数据。json格式的导入还可以使用jsonlite和和geojasonio包。

library("rio")

x <- import("mtcars.csv")
y <- import("mtcars.rds")
z <- import("mtcars.dta")

export(mtcars, "mtcars.csv")
export(mtcars, "mtcars.rds")
export(mtcars, "mtcars.xls")

纯文本格式

.csv格式是最常见格式,有三种读入R的方法:1)基础R的read.csv(),2)fread() 里data.table方法3)较新的readr包里read_csv()函数。虽然有所差异,但是交叉兼容。read.csv()是read.delim()和read.table()的封装。
readstata13包是专门读取Stata13以上版本的.dta文件而开发的。对于小于1M的数据,read.csv()比read_csv()要快,然而fread()比两个都快,如果是更大的数据,read_csv()和data.table比read.csv()快5倍左右。

fread()与read_csv()的差异

readr与基础read_()一样,是基于前1000行而不是所有行来决定每个变量的类。使用readr的话,会将违规数值转换成NA,而fread()会自动将它认为是数值的列转化成字符,fread()另一特征是可以使用列名或索引来设置select参数,从而有选择的读取列。总的来说,三者在读入数据的差异超过了代码执行的时间,与基础R相比,其他两个的速度提升是一定程度的牺牲健壮性为代价的。
在基础R中stringAsFactors=TRUE时才会将字符不转化为因子,而fread()和read_csv()函数默认返回字符型。read_
()生成tbl_df类,而fread()产生data.table()类对象,没有实际差别,处理稍有不同,除非trbble包被加载。

R外预处理文本

读入一个4G的文本文件,会耗尽16G的内存RAM,可以使用shell命令split等分割文件,采用数据库是另外一个解决方案。
split -b100m bigfile.csv # -b100m意思是分割成100m每个的文件。

二进制文件格式

纯文本格式有局限性,缺少类型安全,限于表格,限制 了数值精度,以二进制保存,可以减少读写时间和文件大小。

R自带的文件格式:Rds和Rdata

save()为Rdata是应用最广泛的,函数功能类似save.img()和save.imge()。
saveRDS()函数应用相对较少,作者推荐这个,保存R对象更加简洁,readRDS()更加灵活,结果对象可赋值任何名字。使用这个是个好习惯,强制指定对象名字。

feather文件格式

这是为了R语言与Python程序员协作而设计的格式,速度快,轻量、保存数据框是与语言无关。

二进制文件的基准测试

Rds文件表现最好,磁盘空间仅仅是csv文件的1/4多点,feather格式大约是csv的一半。读入,比read.csv()快十倍左右,写feather更快,比write.csv()快十倍,而saveRDS()仅仅快1.2倍。

Protocol Buffers格式

谷歌的,RProtoBuf包提供了R接口。

从互联网获得数据

download.file()函数和zip()可以批量下载和解压数据。read_csv()也可以直接读取网址中的数据,但是如果下载失败需要重复下载。

fileUrl <- "http://www.newcl.org/data/zipfiles/a1.zip"
download.file(fileUrl, destfile = "a1.zip") #下载并保留原始文件名
unzip('a1.zip', exdir="data")
file.remove("1.zip") #移除原文件防止空间浪费

rOpenSci是众多帮助下载和导入数据的包,下面的代码是通过WDI包(不被rOpenSci支持),访问世界银行下载的交通CO2排放的数据:

> library("WDI")
> WDIsearch("CO2")
      indicator              name                                                                                                                               
 [1,] "EN.ATM.CO2E.CP.KT"    "CO2 emissions from cement production (thousand metric tons)"                                                                      
 [2,] "EN.ATM.CO2E.EG.ZS"    "CO2 intensity (kg per kg of oil equivalent energy use)"                                                                           
 [3,] "EN.ATM.CO2E.FF.KT"    "CO2 emissions from fossil-fuels, total (thousand metric tons)"                                                                    
 [4,] "EN.ATM.CO2E.FF.ZS"    "CO2 emissions from fossil-fuels (% of total)"                                                                                     
 [5,] "EN.ATM.CO2E.GDP"      "CO2 emissions, industrial (kg per 1987 US$ of GDP)"                                                                               
 [6,] "EN.ATM.CO2E.GF.KT"    "CO2 emissions from gaseous fuel consumption (kt) "                                                                                
 [7,] "EN.ATM.CO2E.GF.ZS"    "CO2 emissions from gaseous fuel consumption (% of total) "                                                                        
 [8,] "EN.ATM.CO2E.GL.KT"    "CO2 emissions from gas flaring (thousand metric tons)"                                                                            
 [9,] "EN.ATM.CO2E.KD.87.GD" "CO2 emissions, industrial (kg per 1987 US$ of GDP)"          
CO2_transport <- WDI(indicator = "EN.CO2.TRAN.ZS") 
> head(CO2_transport)
  iso2c    country EN.CO2.TRAN.ZS year
1    1A Arab World             NA 2020
2    1A Arab World             NA 2019
3    1A Arab World             NA 2018
4    1A Arab World             NA 2017
5    1A Arab World             NA 2016
6    1A Arab World             NA 2015

最好在代码中对数据来源做些简单注释,方便代码对自己和他人的可用性。与Web页面交互的两个包是httr和RCurl包,httr有相对友好的用户接口(没有图形界面的),RCurl是更接近底层。

访问包中的数据

示例数据可以用如下方式查看:
data(package="dplyr")

Data sets in package ‘dplyr’:

band_instruments                Band membership
band_instruments2               Band membership
band_members                    Band membership
starwars                        Starwars characters
storms                          Storm tracks data

原始数据通常位于R包的extdata目录中,system.file()函数输出具体包的文件路径:

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

推荐阅读更多精彩内容