官术网_书友最值得收藏!

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文件。

主站蜘蛛池模板: 辽宁省| 澄城县| 崇仁县| 三河市| 台州市| 炉霍县| 伊春市| 乌拉特中旗| 正镶白旗| 沧源| 崇阳县| 合肥市| 新干县| 安乡县| 商城县| 湘乡市| 莱芜市| 阿拉善盟| 星子县| 呈贡县| 会理县| 隆尧县| 海原县| 栾城县| 二手房| 延川县| 祁阳县| 永城市| 门源| 邻水| 武冈市| 封丘县| 盱眙县| 漾濞| 原阳县| 平乐县| 肇源县| 萨迦县| 怀远县| 共和县| 溧阳市|