- R語言經典實例(原書第2版)
- (美)J.D.隆 保羅·蒂特
- 1018字
- 2020-08-03 16:43:35
4.7 讀取表格數據文件
4.7.1 問題
你希望讀取包含空格分隔數據表的文本文件。
4.7.2 解決方案
使用readr包中的read_table2函數,該函數返回一個tibble:
library(tidyverse) tab1 <- read_table2("./data/datafile.tsv") #> Parsed with column specification: #> cols( #> last = col_character(), #> first = col_character(), #> birth = col_double(), #> death = col_double() #> ) tab1 #> # A tibble: 5 x 4 #> last first birth death #> <chr> <chr> <dbl> <dbl> #> 1 Fisher R.A. 1890 1962 #> 2 Pearson Karl 1857 1936 #> 3 Cox Gertrude 1900 1978 #> 4 Yates Frank 1902 1994 #> 5 Smith Kirstine 1878 1939
4.7.3 討論
表格數據文件非常常見。它們是具有簡單格式的文本文件:
·每行對應一條記錄。
·在每條記錄中,不同記錄、數據域(或變量)由分隔符分開,比如空格或tab(制表符)。
·每條記錄包含相同數目的字段。
這種格式的數據比固定寬度的格式更為靈活,因為字段不需要按位置對齊。以下是4.6節中數據的表格格式,其中字段之間使用制表符分隔:
last first birth death Fisher R.A. 1890 1962 Pearson Karl 1857 1936 Cox Gertrude 1900 1978 Yates Frank 1902 1994 Smith Kirstine 1878 1939
函數read_table2旨在對你的數據做出一些好的猜測。它假設你的數據在第一行中具有列名稱。函數read_table2會猜測你的分隔符,并根據數據集中的前1000條記錄來估算你的列類型。下面是一個以空格分隔數據的示例。
源文件如下所示:
last first birth death Fisher R.A. 1890 1962 Pearson Karl 1857 1936 Cox Gertrude 1900 1978 Yates Frank 1902 1994 Smith Kirstine 1878 1939
函數read_table2做了一些合理的猜測:
t <- read_table2("./data/datafile1.ssv") #> Parsed with column specification: #> cols( #> last = col_character(), #> first = col_character(), #> birth = col_double(), #> death = col_double() #> ) print(t) #> # A tibble: 5 x 4 #> last first birth death #> <chr> <chr> <dbl> <dbl> #> 1 Fisher R.A. 1890 1962 #> 2 Pearson Karl 1857 1936 #> 3 Cox Gertrude 1900 1978 #> 4 Yates Frank 1902 1994 #> 5 Smith Kirstine 1878 1939
通常read_table2都能猜對。但與其他readr導入函數一樣,你可以使用顯式參數覆蓋默認值:
t <- read_table2( "./data/datafile1.ssv", col_types = c( col_character(), col_character(), col_integer(), col_integer() ) )
如果任何字段包含字符串"NA",則read_table2假定該值丟失并將其轉換為NA。你的數據文件可能使用不同的字符串來代表缺失值,在這種情況下會使用na參數。例如,SAS中缺失值通常由單個句點(.)表示。我們可以使用na="."來讀取這樣的文本文件。如果我們有一個名為datafile_missing.tsv的文件,最后一行的缺失值用.表示:
last first birth death Fisher R.A. 1890 1962 Pearson Karl 1857 1936 Cox Gertrude 1900 1978 Yates Frank 1902 1994 Smith Kirstine 1878 1939 Cox David 1924 .
我們可以使用如下方式導入:
t <- read_table2("./data/datafile_missing.tsv", na = ".") #> Parsed with column specification: #> cols( #> last = col_character(), #> first = col_character(), #> birth = col_double(), #> death = col_double() #> ) t #> # A tibble: 6 x 4 #> last first birth death #> <chr> <chr> <dbl> <dbl> #> 1 Fisher R.A. 1890 1962 #> 2 Pearson Karl 1857 1936 #> 3 Cox Gertrude 1900 1978 #> 4 Yates Frank 1902 1994 #> 5 Smith Kirstine 1878 1939 #> 6 Cox David 1924 NA
我們是自我解釋型數據的愛好者:文件中包含介紹其內容的信息。(計算機科學家稱文件包含了元數據。)read_table2函數默認假設文件的第一行是帶有列名的標題行。如果你的文件沒有列名,可以使用參數col_names=FALSE將其關閉。
read_table2支持的其他類型的元數據是注釋行。使用comment參數,你可以告訴read_table2區分注釋行的字符。以下文件頂部有一個以#開頭的注釋行:
# The following is a list of statisticians last first birth death Fisher R.A. 1890 1962 Pearson Karl 1857 1936 Cox Gertrude 1900 1978 Yates Frank 1902 1994 Smith Kirstine 1878 1939
我們可以導入該文件如下:
t <- read_table2("./data/datafile.ssv", comment = '#') #> Parsed with column specification: #> cols( #> last = col_character(), #> first = col_character(), #> birth = col_double(), #> death = col_double() #> ) t #> # A tibble: 5 x 4 #> last first birth death #> <chr> <chr> <dbl> <dbl> #> 1 Fisher R.A. 1890 1962 #> 2 Pearson Karl 1857 1936 #> 3 Cox Gertrude 1900 1978 #> 4 Yates Frank 1902 1994 #> 5 Smith Kirstine 1878 1939
read_table2有許多參數用于控制如何讀取和解釋輸入文件。有關詳細信息,請參閱幫助頁面(?read_table2)或readr的vignette(vignette("readr"))。如果你對read_table和read_table2之間的區別感到好奇,那么可以在幫助文件中查找。但簡短的回答是,read_table在文件結構和行長度方面略微不那么寬容。
4.7.4 另請參閱
如果你的數據文件是以逗號作為分隔符,請參閱4.8節來讀取CSV文件。
- 計算機網絡
- Visual C++串口通信開發入門與編程實踐
- Ext JS Data-driven Application Design
- C語言程序設計立體化案例教程
- Functional Programming in JavaScript
- Java:Data Science Made Easy
- Windows Forensics Cookbook
- Functional Kotlin
- 軟件測試技術指南
- RESTful Java Web Services(Second Edition)
- 智能搜索和推薦系統:原理、算法與應用
- Android應用開發實戰
- MyBatis 3源碼深度解析
- UX Design for Mobile
- Python數據預處理技術與實踐