《高效R語言編程》5-高效輸入輸出

2022-01-22 微因

在讀取一行數據之前,應該先考慮下重複數據管理的通用規則,不改寫原始數據。原始文件視為只讀,保留原始文件名字並說明來源,是一個好辦法。

軟體配置

幾個包:

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"   

可以通過下圖的方式,按tab鍵就可以查看文件夾結構:

相關焦點

  • 【R數據處理】R語言數據輸入輸出總結
    」   --科白君在數據分析和處理前,無論對新手還是對老手來說不可避免的一件事就是數據輸入。高效的數據輸入和輸出不僅可以節省大量的時間,還能為以後數據的複查做好準備。本節,我們就對常見的幾種數據格式的輸入和輸出做做總結,希望對經常使用R的朋友們有所幫助。
  • 八招提升你的 R 語言編程能力
    他們在研究過程中,往往只關注於獨立的模型方法或者漂亮的可視化效果,卻沒人嘗試通過學習計算機科學的相關課程提高自身掌握程式語言的能力,幫助他們敲出更優化和專業的代碼——具有良好的易讀性,可重複使用,運行高效,內存佔用合理,容易移植,最重要的是可以產出可信的結果。作者也不外如是。他在研究期間,曾有過使用 R 語言和Matlab 用於大量機器學習算法的實踐經歷。
  • R語言數據清洗實戰——高效list解析方案
    杜雨:EasyCharts團隊成員,R語言中文社區專欄作者。興趣方向為:Excel商務圖表,R語言數據可視化,地理信息數據可視化。個人公眾號:數據小魔方(微信ID:datamofang) ,「數據小魔方」創始人。
  • 如何正確「輸入+輸出」,讓英語學習更高效
    針對英語學習,強浩老師結合親身經歷,推出了答讀者一百問系列,「目的很簡單,希望給大家一些建議,讓我們的英語學習更加高效,少走一些彎路,同時希望大家能把英語學習堅持到底」本期為第3期,上期8-12問內容請點上圖查看點擊上圖就能查看第 2 期的8-12問內容啦,那麼我們就一起開啟第
  • 《高效學習7堂課》:你的輸出真的能倒逼輸入嗎?
    當我再次翻開《高效學習7堂課》,我沒有通篇閱讀這7種能力:定位力、框架力、精進力、聯機力、復盤力、輸出力和遷移力。我開始聚焦在輸出力這一點上,它的一個標題是「別用低質量的輸出感動自己」,我不禁思考:我的輸出,即讀書筆記是不是低質量的輸出?
  • C\C++語言5|控制臺和文件的輸入、輸出
    輸入輸出作為庫載入,也是為了空間效率的考量,當你不需要時,就可以不載入,讓程序更輕量級。一、C語言的輸入輸出程序輸入源和輸出目標統稱為設備(device)。無論什麼設備,是用於輸入還是輸出,C語言都通過流進行輸入和輸出操作。流與文件息息相關。這裡的文件指的不是磁碟文件,而是程序待處理的流和實際物理設備之間的媒介。大多數情況下,C語言的初學者無需了解這些文件,因為流、文件、設備之間的交互都由C庫函數和作業系統自動完成。C語言的流有兩種模式:文本模式和二進位模式。文本流只由字符組成,如發送至屏幕的文本數據。
  • iEng自然語言輸入—輸出系統介紹
    並且這是最簡單,最高效的語言學習模式! 聽一句話是輸入的過程,而大概知道什麼意思就是可理解性輸入,出聲跟讀是輸出過程。這樣就構成了語言學習最簡單和最重要的一個閉環:輸入和輸出。  iEng自然語言輸入一輸出系統的聽讀平臺,精選超過5000冊英文原版圖書,把所有圖書內容拆分為單句格式,一句一句原聲播放。
  • Python格式化輸入輸出
    輸入輸出Python當中的標準輸入輸出是input和print。輸出print會輸出一個字符串,如果傳入的不是字符串會自動調用__str__方法轉成字符串進行輸出。使用原始形象輸出"%r" % "123"print("%d" % 10)print("%f" % 3.1415926)print("%s" % '字符串')print("%r" % '\n') #使用原始形象輸出
  • R編程與R繪圖
    這時候R語言編程就會派上用場。例如從大的方面來看,投資方要決定在何處建立風力發電場,就需要採集天氣數據加以建模分析,評估各項目方案。從小的方面來看,個人是否應該購買某個理財產品,你需要獲取過去的市場信息,模擬未來可能的變化,計算該項資產未來的期望收益和標準差。所以說學習R編程就是學習在數據環境中解決問題,從中磨練技術、鍛鍊智力,還能得到滿足的快感。
  • R語言高效的管道操作magrittr
    目錄magrittr介紹magrittr安裝magrittr包的基本使用magrittr包的擴展功能1. magrittr介紹magrittr包被定義為一個高效的管道操作工具包,通過管道的連接方式,讓數據或表達式的傳遞更高效
  • 如何高效運行R語言
    進入正題 ==>高效的代碼減少函數調用和C/C++等語言強調數據類型不同,R語言為用戶隱藏了數據類型,這為R用戶帶來了方便,但是付出的代價就是運行效率。R語言的很多基礎函數也是用C語言寫的,你可以認為R函數是對C語言函數的包裝,方便用戶的調用。
  • Python中的輸入和輸出設置格式
    編程學習與學習程式語言的語法無關。如果你讀通任何材料,例如書籍或教程,那麼編程就不意味著要學習。編程全部與構造邏輯有關,語法僅發揮5%的作用。如果你擅長邏輯構建,那麼僅需幾天時間,你就可以學習任何程式語言。我的文章將集中於構造邏輯以及將語法映射到所創建的邏輯。
  • C語言-輸入與輸出函數
    眾所周知,C語言需要輸入和輸出,那麼今天小編我就帶領大家去學習這個編程必不可少的輸入和輸出函數。一,首先我們先來學習輸出函數(printf)其意義是:按指定的格式輸出值。因此,函數在括號中的參數都由以下兩部分組成:1、 格式控制串:格式控制串是一個字符串,必須用雙引號括起來,它表示了輸入輸出量的數據類型。在printf函數中可以在格式控制串內出現非格式控制字符,這時在顯示屏幕上會顯示源字符串。2、參數表:參數表中給出了輸出的變量。當有多個變量時,用英文逗號(,)分開。
  • 怎樣做到高效閱讀、高效輸出?
    怎樣做到高效閱讀、高效輸出? 很多人看過不少書,但真正用的時候或向他人表達的時候,大腦就變的一片空白?怎樣才能做到高效閱讀,並且把知識變成自己的東西呢?《每周新書盤點》主理人陳章魚說,想要系統、高效率地輸出,你需要在三個方面下功夫。 第一個方面是高效率的輸入,也就是大量的閱讀。比如陳章魚本人,一周要讀六到七本書。他認為,高效率輸出前提一定是高效率的輸入。
  • 18 個 Python 高效編程小技巧,Mark!
    初識Python語言,覺得python滿足了你上學時候對程式語言的所有要求。python語言的高效編程技巧讓那些曾經苦逼學了四年c或者c++的人,興奮的不行不行的,終於解脫了。高級語言,如果做不到這樣,還扯啥高級呢?這個情況如果要交換變量在c++中,肯定需要一個空變量。
  • 編程模板-R語言腳本寫作:最簡單的統計與繪圖,包安裝、命令行參數解析、文件讀取、表格和矢量圖輸出
    個人認為:是否能熟悉使用Shell(項目流程搭建)+R(數據統計與可視化)+Perl/Python等(膠水語言,數據格式轉換,軟體間銜接)三門語言是一位合格生物信息工程師的標準。Anova組間統計和箱線圖展示、表格和矢量圖輸出等。
  • Elixir:程式語言的未來
    但是近期 Elixir 的生態逐漸完善,越來越多的專家開始關注這門語言,並且 給予 Elixir 好評。現在開始接觸 Elixir一個小的 Elixir 例子並行處理 JSON 字符串輸入,並且解析成可用的變量,計算每秒處理的速度並輸出。
  • R語言-安裝使用指南
    R語言 概述R語言是用於統計分析,圖形表示和報告的程式語言和軟體環境。
  • Elixir: 程式語言的未來
    但是近期 Elixir 的生態逐漸完善,越來越多的專家開始關注這門語言,並且 給予 Elixir 好評。現在開始接觸 Elixir一個小的 Elixir 例子並行處理 JSON 字符串輸入,並且解析成可用的變量,計算每秒處理的速度並輸出。
  • vipJr上線小學語文課程,為語文學習的輸入與輸出提效
    vipJr上線小學語文課程,為語文學習的輸入與輸出提效 作者:紅印兒 發布時間: