1. 導入編

はじめに

  • {tibble}はデータフレームを扱いやすくするために再定義されたクラス
  • 従来のデータフレームを拡張したリスト型コラムを扱うこともできる



登録数

## [1] 28
##  [1] "add_column"           "add_row"              "as_data_frame"       
##  [4] "as_tibble"            "column_to_rownames"   "data_frame"          
##  [7] "data_frame_"          "enframe"              "frame_data"          
## [10] "glimpse"              "has_name"             "has_rownames"        
## [13] "is.tibble"            "is_tibble"            "is_vector_s3"        
## [16] "knit_print.trunc_mat" "lst"                  "lst_"                
## [19] "obj_sum"              "remove_rownames"      "repair_names"        
## [22] "rownames_to_column"   "tbl_sum"              "tibble"              
## [25] "tibble_"              "tribble"              "trunc_mat"           
## [28] "type_sum"



2. 特徴編

2.1 型の自動変換を排除

  • 文字列のファクター自動変換をはじめとして、データ型の自動変換を排除している
# tibble関数
# --- そのまま文字列で格納される
tibble(x = letters) %>% str()
## Classes 'tbl_df', 'tbl' and 'data.frame':    26 obs. of  1 variable:
##  $ x: chr  "a" "b" "c" "d" ...
# data.frame関数
# --- 文字列がファクターに自動変換される
data.frame(x = letters) %>% str()
## 'data.frame':    26 obs. of  1 variable:
##  $ x: Factor w/ 26 levels "a","b","c","d",..: 1 2 3 4 5 6 7 8 9 10 ...



2.2 リスト型コラムの作成を簡素化

  • データフレームと同じ感覚でリスト型コラムを作成できる
  • データフレームの列数分のリストを作成する必要がある
# tibble関数
# --- リスト要素をデータフレームの要素にする (リスト型コラム)
tibble(x = 1:3, y = list(1:5, 1:10, 1:20))
## # A tibble: 3 × 2
##       x          y
##   <int>     <list>
## 1     1  <int [5]>
## 2     2 <int [10]>
## 3     3 <int [20]>



2.3 列名の自動変換を排除

  • 空白の箇所に自動的に“.(ドット)”が付けられるという事象を排除している
# tibble関数
# --- そのまま表示される
tibble('crazy name' = 1) %>% names()
## [1] "crazy name"
# data.frame関数
# --- 空白の箇所に自動的に".(ドット)"が付けられる
data.frame('crazy name' = 1) %>% names()
## [1] "crazy.name"



2.4 遅延評価に対応

  • 引数を遅延的かつ逐次的に評価する
tibble(x = 1:5, y = x ^ 2)
## # A tibble: 5 × 2
##       x     y
##   <int> <dbl>
## 1     1     1
## 2     2     4
## 3     3     9
## 4     4    16
## 5     5    25
data.frame(x = 1:5, y = x ^ 2)
## Error in data.frame(x = 1:5, y = x^2):  オブジェクト 'x' がありません
  • オブジェクト作成の際に遅延評価による定義が可能となる
# tibble関数
# --- 遅延評価により以下のような定義も可能
tibble(x = 1:5, y = x ^ 2)
## # A tibble: 5 × 2
##       x     y
##   <int> <dbl>
## 1     1     1
## 2     2     4
## 3     3     9
## 4     4    16
## 5     5    25
# data.frame関数
# --- エラーになる
data.frame(x = 1:5, y = x ^ 2)
## Error in data.frame(x = 1:5, y = x^2):  オブジェクト 'x' がありません



*2.5 行名の定義を排除

  • tibbleクラスはリスト型コラムなど構造的な形式を取り得るので行名定義はしない
    • 通常のデータフレームでも行名を使うことは少ない(xtsくらい?)
    • 行名定義はパイプライクな操作ではない
# tibble関数
# --- row.names()の箇所でエラーとなる
X <- tibble(x = 1:5) %T>% print()
row.names(X) <- letters[1:5]
## Warning: Setting row names on a tibble is deprecated.
X
## # A tibble: 5 × 1
##       x
##   <int>
## 1     1
## 2     2
## 3     3
## 4     4
## 5     5
## # A tibble: 5 × 1
##       x
## * <int>
## 1     1
## 2     2
## 3     3
## 4     4
## 5     5


# data.frame関数
# --- 行名を定義できる
Y <- data.frame(x = 1:5) %T>% print()
row.names(Y) <- letters[1:5]
Y
##   x
## 1 1
## 2 2
## 3 3
## 4 4
## 5 5
##   x
## a 1
## b 2
## c 3
## d 4
## e 5



2.6 リサイクル機能の制限

# tibble関数
# --- 長さが1のベクトルは制限なくリサイクル
tibble(x = 1:4, y = 1)
## # A tibble: 4 × 2
##       x     y
##   <int> <dbl>
## 1     1     1
## 2     2     1
## 3     3     1
## 4     4     1
# --- それ以外はリサイクル禁止でエラー
tibble(x = 1:4, y = 1:2)
## Error: Variables must be length 1 or 4.
## Problem variables: 'y'


# data.frame関数
# --- 長さが1のベクトルは制限なくリサイクル(同様)
data.frame(x = 1:4, y = 1)
##   x y
## 1 1 1
## 2 2 1
## 3 3 1
## 4 4 1
# --- 長さが1以外でもリサイクルが途中で終わらなければ使える
data.frame(x = 1:4, y = 1:2)
##   x y
## 1 1 1
## 2 2 2
## 3 3 1
## 4 4 2
# --- リサイクルが途中で終わるものはエラー
data.frame(x = 1:4, y = 1:3)
## Error in data.frame(x = 1:4, y = 1:3): arguments imply differing number of rows: 4, 3



2.7 コンソールへの出力制限

  • tibble()はコンソールに表示するデータが自動で制限される
    • コンソールがデータで埋め尽くされるのを排除
# tibble関数
# --- 初めの10データのみ表示
tibble(x = 1:1000)
## # A tibble: 1,000 × 1
##        x
##    <int>
## 1      1
## 2      2
## 3      3
## 4      4
## 5      5
## 6      6
## 7      7
## 8      8
## 9      9
## 10    10
## # ... with 990 more rows
# data.frame関数
# --- 全て表示されるので一部のみ表示
data.frame(x = 1:1000) %>% head(5)
##   x
## 1 1
## 2 2
## 3 3
## 4 4
## 5 5



2.8 単独列でもtibbleクラスを維持

  • tibbleは単独列でもtibbleクラスを維持する
    • ベクトル表示したい場合は$演算子を使う
    • data.frameは単独列の場合はベクトルとして扱われる

tibble()

# tibble関数
X <- tibble(x = 1:3, y = 3:1)

# 複数列の場合はデータフレームと判断
X[, 1:2] %>% class()
## [1] "tbl_df"     "tbl"        "data.frame"
# 単独列でもデータフレーム
X[, 1] %>% class()
## [1] "tbl_df"     "tbl"        "data.frame"
# 実際にtibbleクラスとして出力
X[, 1]
## # A tibble: 3 × 1
##       x
##   <int>
## 1     1
## 2     2
## 3     3
# $演算子を使うとベクトル出力
X$x
## [1] 1 2 3


data.frame()

# data.frame関数
# --- 全て表示されるので一部のみ表示
Y <- data.frame(x = 1:3, y = 3:1) %T>% print()
##   x y
## 1 1 3
## 2 2 2
## 3 3 1
# 複数列の場合はデータフレームと判断
Y[, 1:2] %>% class()
## [1] "data.frame"
# 単独列だとベクトルと判断してデータ型を返す
Y[, 1] %>% class()
## [1] "integer"
# 実際にベクトルとして出力
Y[, 1]
## [1] 1 2 3



3. パフォーマンス編

  • tibbleクラスの定義はデータフレームクラスよりも高速
    • as.tibble()as.data.frame()よりもかなり速い
    • as.data.frame()は実際にボトルネックになることが多いようだ
# 準備:計測用オブジェクト
X <- replicate(26, sample(100), simplify = FALSE)
names(X) <- letters
X %>% list.tree()
##  . = list 26 (13296 bytes)
## .  a = integer 100= 33 14 85 50 71 82 ...
## .  b = integer 100= 63 17 42 53 15 51 ...
## .  c = integer 100= 73 83 19 44 86 65 ...
## .  d = integer 100= 19 38 53 27 47 91 ...
## .  e = integer 100= 26 72 50 59 34 55 ...
## .  f = integer 100= 92 65 39 59 35 10 ...
## .  g = integer 100= 36 11 81 34 100 ...
## .  h = integer 100= 65 58 27 74 76 67 ...
## .  i = integer 100= 52 91 74 78 68 16 ...
## .  j = integer 100= 4 90 44 38 18 9 ...
## .  k = integer 100= 75 79 33 76 12 38 ...
## .  l = integer 100= 16 12 9 85 61 44 ...
## .  ...   and 14 more
# 速度検証
microbenchmark::microbenchmark(
  as_tibble(X),
  as.data.frame(X)
)
## Unit: microseconds
##              expr      min       lq      mean   median        uq      max
##      as_tibble(X)  328.425  346.153  421.5816  377.876  432.9235 2006.002
##  as.data.frame(X) 1805.402 1860.294 1987.6496 1933.226 2098.3715 2545.912
##  neval cld
##    100  a 
##    100   b



4. 関数編

4-1 データフレーム作成

tibble / data_frame

  • tibbleクラスのデータセットを作成する
    • data_frame()でも同様の操作を行うことができる
    • tibble_の場合はリストで指定する
# データフレームの作成
# --- tibble関数
tibble(x = 1:5, y = x * 2)
## # A tibble: 5 × 2
##       x     y
##   <int> <dbl>
## 1     1     2
## 2     2     4
## 3     3     6
## 4     4     8
## 5     5    10
# データフレームの作成
# --- data_frame関数
data_frame(x = 1:5, y = x * 2)
## # A tibble: 5 × 2
##       x     y
##   <int> <dbl>
## 1     1     2
## 2     2     4
## 3     3     6
## 4     4     8
## 5     5    10
# リストの作成
tibble_(list(x = ~1:5, y = ~x * 2))
## # A tibble: 5 × 2
##       x     y
##   <int> <dbl>
## 1     1     2
## 2     2     4
## 3     3     6
## 4     4     8
## 5     5    10



as_tibble / as_data_frame

  • リストをデータフレームに変換
    • as_tibbleas_data_frameは同様の動作
# 準備:リストの作成
iris %>% class()
## [1] "data.frame"
# 方法1:リストをデータフレームに変換
iris %>% as_tibble() %>% class()
## [1] "tbl_df"     "tbl"        "data.frame"
# 方法2:リストをデータフレームに変換
iris %>% as_data_frame() %>% class()
## [1] "tbl_df"     "tbl"        "data.frame"
# 参考:データセットの確認
iris %>% as_tibble()
## # A tibble: 150 × 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl>  <fctr>
## 1           5.1         3.5          1.4         0.2  setosa
## 2           4.9         3.0          1.4         0.2  setosa
## 3           4.7         3.2          1.3         0.2  setosa
## 4           4.6         3.1          1.5         0.2  setosa
## 5           5.0         3.6          1.4         0.2  setosa
## 6           5.4         3.9          1.7         0.4  setosa
## 7           4.6         3.4          1.4         0.3  setosa
## 8           5.0         3.4          1.5         0.2  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 10          4.9         3.1          1.5         0.1  setosa
## # ... with 140 more rows



is_tibble / is.tibble

  • tibbleクラスかどうかを判定
    • is.tibble()という関数もある(動作は一緒)
# 準備:データフレームを2形式で作成
X1 <- iris
X2 <- iris %>% as_tibble()

# data.frameクラスなのでFALSE
X1 %>% is.tibble()
## [1] FALSE
# tibbleクラスなのでTRUE
X2 %>% is.tibble()
## [1] TRUE
X2 %>% is_tibble()
## [1] TRUE



tribble

  • 直接入力でtibbleクラスのデータフレームを定義
    • 列名には~(チルダ)を付ける
tribble(
~colA, ~colB,
"a", 1,
"b", 2,
"c", 3
)
## # A tibble: 3 × 2
##    colA  colB
##   <chr> <dbl>
## 1     a     1
## 2     b     2
## 3     c     3



enframe

  • アトミックベクトルをデータフレーム形式に変換する
    • ベクトルの名前要素の2列で構成
    • 名前がない場合はインデクス番号が付けられる
  • リストをデータフレーム形式に変換する
    • リスト要素の名前ネストされた要素の2列で構成
# ベクトルを変換
c(a = 5, b = 7) %>% enframe()
## # A tibble: 2 × 2
##    name value
##   <chr> <dbl>
## 1     a     5
## 2     b     7
# リストを変換
list(A = 1:5, B = 6:10) %>% enframe()
## # A tibble: 2 × 2
##    name     value
##   <chr>    <list>
## 1     A <int [5]>
## 2     B <int [5]>



4-2 行列追加

add_column

  • 既存のデータフレームに列を追加する
    • デフォルトでは最後の列の後
    • .before引数.after引数でどこにでも追加可能
# 準備:データフレームの作成
df <- tibble(x = 1:3, y = 3:1) %T>% print()
## # A tibble: 3 × 2
##       x     y
##   <int> <int>
## 1     1     3
## 2     2     2
## 3     3     1
# 列の追加
# --- 初期状態では最後尾に追加
df %>% add_column(z = -1:1, w = 0)
## # A tibble: 3 × 4
##       x     y     z     w
##   <int> <int> <int> <dbl>
## 1     1     3    -1     0
## 2     2     2     0     0
## 3     3     1     1     0
# 列の追加
# --- 最前列の前に追加
df %>% add_column(z = -1:1, w = 0, .before = "x")
## # A tibble: 3 × 4
##       z     w     x     y
##   <int> <dbl> <int> <int>
## 1    -1     0     1     3
## 2     0     0     2     2
## 3     1     0     3     1



add_row

  • 既存のデータフレームに行を追加する
# 準備:データフレームの作成
df <- tibble(x = 1:3, y = 3:1) %T>% print()
## # A tibble: 3 × 2
##       x     y
##   <int> <int>
## 1     1     3
## 2     2     2
## 3     3     1
# 行を追加
df %>% add_row(x = 4, y = 0)
## # A tibble: 4 × 2
##       x     y
##   <dbl> <dbl>
## 1     1     3
## 2     2     2
## 3     3     1
## 4     4     0



4-3 行名操作

has_rownames

  • 行名を持つかどうかを判定する
# 準備:データセットが行名を持つことを確認
mtcars %>% attributes()
## $names
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
## 
## $row.names
##  [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"         
##  [4] "Hornet 4 Drive"      "Hornet Sportabout"   "Valiant"            
##  [7] "Duster 360"          "Merc 240D"           "Merc 230"           
## [10] "Merc 280"            "Merc 280C"           "Merc 450SE"         
## [13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
## [16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"           
## [19] "Honda Civic"         "Toyota Corolla"      "Toyota Corona"      
## [22] "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
## [25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"      
## [28] "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
## [31] "Maserati Bora"       "Volvo 142E"         
## 
## $class
## [1] "data.frame"
# 行名を持つかどうかを判定
mtcars %>% has_rownames()
## [1] TRUE



remove_rownames

  • 行名を削除する
# 準備:データセットが行名を持つことを確認
mtcars %>% attributes()
## $names
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
## 
## $row.names
##  [1] "Mazda RX4"           "Mazda RX4 Wag"       "Datsun 710"         
##  [4] "Hornet 4 Drive"      "Hornet Sportabout"   "Valiant"            
##  [7] "Duster 360"          "Merc 240D"           "Merc 230"           
## [10] "Merc 280"            "Merc 280C"           "Merc 450SE"         
## [13] "Merc 450SL"          "Merc 450SLC"         "Cadillac Fleetwood" 
## [16] "Lincoln Continental" "Chrysler Imperial"   "Fiat 128"           
## [19] "Honda Civic"         "Toyota Corolla"      "Toyota Corona"      
## [22] "Dodge Challenger"    "AMC Javelin"         "Camaro Z28"         
## [25] "Pontiac Firebird"    "Fiat X1-9"           "Porsche 914-2"      
## [28] "Lotus Europa"        "Ford Pantera L"      "Ferrari Dino"       
## [31] "Maserati Bora"       "Volvo 142E"         
## 
## $class
## [1] "data.frame"
# 行名を持つかどうかを判定
mtcars %>% remove_rownames() %>% attributes()
## $names
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
## 
## $row.names
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
## [24] 24 25 26 27 28 29 30 31 32
## 
## $class
## [1] "data.frame"



rownames_to_column

  • 行名を列として追加する
# 準備:データセットが行名を持つことを確認
mtcars %>% names()
##  [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
## [11] "carb"
# データセットに行名を追加
X <- mtcars %>% rownames_to_column() %T>% names()

# 参考:データセットの確認
X %>% as_tibble()
## # A tibble: 32 × 12
##              rowname   mpg   cyl  disp    hp  drat    wt  qsec    vs    am
##                <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1          Mazda RX4  21.0     6 160.0   110  3.90 2.620 16.46     0     1
## 2      Mazda RX4 Wag  21.0     6 160.0   110  3.90 2.875 17.02     0     1
## 3         Datsun 710  22.8     4 108.0    93  3.85 2.320 18.61     1     1
## 4     Hornet 4 Drive  21.4     6 258.0   110  3.08 3.215 19.44     1     0
## 5  Hornet Sportabout  18.7     8 360.0   175  3.15 3.440 17.02     0     0
## 6            Valiant  18.1     6 225.0   105  2.76 3.460 20.22     1     0
## 7         Duster 360  14.3     8 360.0   245  3.21 3.570 15.84     0     0
## 8          Merc 240D  24.4     4 146.7    62  3.69 3.190 20.00     1     0
## 9           Merc 230  22.8     4 140.8    95  3.92 3.150 22.90     1     0
## 10          Merc 280  19.2     6 167.6   123  3.92 3.440 18.30     1     0
## # ... with 22 more rows, and 2 more variables: gear <dbl>, carb <dbl>



column_to_rownames

  • rownameという名前の列を行名として格納する
    • tibble型で使うと非推奨の警告が出る
    • as.data.frame()を事前に行う事で解消
# 準備:行名用のフィールドを作成
# --- 行名を`rowname`とする点に注意
X <- iris %>% 
       group_by(Species) %>% 
       do(head(., 3)) %>% 
      ungroup() %>% 
       mutate(rowname = paste0(Species, row_number())) %>% 
       select(rowname, everything()) %>% 
       as_tibble() %T>% 
       print()
## # A tibble: 9 × 6
##       rowname Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
##         <chr>        <dbl>       <dbl>        <dbl>       <dbl>     <fctr>
## 1     setosa1          5.1         3.5          1.4         0.2     setosa
## 2     setosa2          4.9         3.0          1.4         0.2     setosa
## 3     setosa3          4.7         3.2          1.3         0.2     setosa
## 4 versicolor4          7.0         3.2          4.7         1.4 versicolor
## 5 versicolor5          6.4         3.2          4.5         1.5 versicolor
## 6 versicolor6          6.9         3.1          4.9         1.5 versicolor
## 7  virginica7          6.3         3.3          6.0         2.5  virginica
## 8  virginica8          5.8         2.7          5.1         1.9  virginica
## 9  virginica9          7.1         3.0          5.9         2.1  virginica
# rowname列を列名として格納する
XX <- X %>% 
        as.data.frame() %>% 
        column_to_rownames() %T>% 
        print()
##             Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## setosa1              5.1         3.5          1.4         0.2     setosa
## setosa2              4.9         3.0          1.4         0.2     setosa
## setosa3              4.7         3.2          1.3         0.2     setosa
## versicolor4          7.0         3.2          4.7         1.4 versicolor
## versicolor5          6.4         3.2          4.5         1.5 versicolor
## versicolor6          6.9         3.1          4.9         1.5 versicolor
## virginica7           6.3         3.3          6.0         2.5  virginica
## virginica8           5.8         2.7          5.1         1.9  virginica
## virginica9           7.1         3.0          5.9         2.1  virginica
# 属性を確認
XX %>% attributes()
## $names
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 
## [5] "Species"     
## 
## $row.names
## [1] "setosa1"     "setosa2"     "setosa3"     "versicolor4" "versicolor5"
## [6] "versicolor6" "virginica7"  "virginica8"  "virginica9" 
## 
## $class
## [1] "data.frame"



参考:set_rownames

  • データフレームの行名をパイプラインの中で変更できる
    • {magrittr}のAliases(別名関数)の1つ
    • tibble型で使うと非推奨の警告が出る
    • as.data.frame()を事前に行う事で解消
# 準備:ユニークな行名を作成
X <- iris %>% 
       group_by(Species) %>% 
       do(head(., 3)) %>% 
      ungroup() %>% 
       mutate(rowname = paste0(Species, row_number())) %>% 
       select(rowname, everything()) %>% 
       as_tibble() %T>% 
       print()
## # A tibble: 9 × 6
##       rowname Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
##         <chr>        <dbl>       <dbl>        <dbl>       <dbl>     <fctr>
## 1     setosa1          5.1         3.5          1.4         0.2     setosa
## 2     setosa2          4.9         3.0          1.4         0.2     setosa
## 3     setosa3          4.7         3.2          1.3         0.2     setosa
## 4 versicolor4          7.0         3.2          4.7         1.4 versicolor
## 5 versicolor5          6.4         3.2          4.5         1.5 versicolor
## 6 versicolor6          6.9         3.1          4.9         1.5 versicolor
## 7  virginica7          6.3         3.3          6.0         2.5  virginica
## 8  virginica8          5.8         2.7          5.1         1.9  virginica
## 9  virginica9          7.1         3.0          5.9         2.1  virginica
# rowname列を列名として格納する
XX <- X %>% 
        as.data.frame() %>% 
        set_rownames(c(.$rowname)) %T>% 
        as_tibble() %>% 
        print()
##                 rowname Sepal.Length Sepal.Width Petal.Length Petal.Width
## setosa1         setosa1          5.1         3.5          1.4         0.2
## setosa2         setosa2          4.9         3.0          1.4         0.2
## setosa3         setosa3          4.7         3.2          1.3         0.2
## versicolor4 versicolor4          7.0         3.2          4.7         1.4
## versicolor5 versicolor5          6.4         3.2          4.5         1.5
## versicolor6 versicolor6          6.9         3.1          4.9         1.5
## virginica7   virginica7          6.3         3.3          6.0         2.5
## virginica8   virginica8          5.8         2.7          5.1         1.9
## virginica9   virginica9          7.1         3.0          5.9         2.1
##                Species
## setosa1         setosa
## setosa2         setosa
## setosa3         setosa
## versicolor4 versicolor
## versicolor5 versicolor
## versicolor6 versicolor
## virginica7   virginica
## virginica8   virginica
## virginica9   virginica
# 属性を確認
XX %>% attributes()
## $class
## [1] "data.frame"
## 
## $row.names
## [1] "setosa1"     "setosa2"     "setosa3"     "versicolor4" "versicolor5"
## [6] "versicolor6" "virginica7"  "virginica8"  "virginica9" 
## 
## $names
## [1] "rowname"      "Sepal.Length" "Sepal.Width"  "Petal.Length"
## [5] "Petal.Width"  "Species"

4-4 列名操作

has_name

  • データフレームに列名があるかを判定する
# 列名が存在するかを判定
iris %>% has_name("Species")
## [1] TRUE



repair_names

  • V1/V2などのように、ユニークな列名を付ける
  • 既にユニークな名前がついている場合は変更なし
# ベクトルの場合
1:5 %>% print()
## [1] 1 2 3 4 5
1:5 %>% repair_names()
## V1 V2 V3 V4 V5 
##  1  2  3  4  5
# リストの場合
list(1:5, 6:10)
## [[1]]
## [1] 1 2 3 4 5
## 
## [[2]]
## [1]  6  7  8  9 10
list(1:5, 6:10) %>% repair_names()
## $V1
## [1] 1 2 3 4 5
## 
## $V2
## [1]  6  7  8  9 10
# データフレームの場合
tibble(1:5, 6:10)
## # A tibble: 5 × 2
##   `1:5` `6:10`
##   <int>  <int>
## 1     1      6
## 2     2      7
## 3     3      8
## 4     4      9
## 5     5     10
tibble(1:5, 6:10) %>% repair_names()
## # A tibble: 5 × 2
##   `1:5` `6:10`
##   <int>  <int>
## 1     1      6
## 2     2      7
## 3     3      8
## 4     4      9
## 5     5     10



参考:set_colnames

  • データフレームの列名をパイプラインの中で変更できる
    • {magrittr}のAliases(別名関数)の1つ
# 列名を変更する
iris %>% 
  as_tibble() %>%  
  set_colnames(c("Sepal.Length_1", "Sepal.Width_1", 
                 "Petal.Length_1", "Petal.Width_1", "Species_1"))
## # A tibble: 150 × 5
##    Sepal.Length_1 Sepal.Width_1 Petal.Length_1 Petal.Width_1 Species_1
##             <dbl>         <dbl>          <dbl>         <dbl>    <fctr>
## 1             5.1           3.5            1.4           0.2    setosa
## 2             4.9           3.0            1.4           0.2    setosa
## 3             4.7           3.2            1.3           0.2    setosa
## 4             4.6           3.1            1.5           0.2    setosa
## 5             5.0           3.6            1.4           0.2    setosa
## 6             5.4           3.9            1.7           0.4    setosa
## 7             4.6           3.4            1.4           0.3    setosa
## 8             5.0           3.4            1.5           0.2    setosa
## 9             4.4           2.9            1.4           0.2    setosa
## 10            4.9           3.1            1.5           0.1    setosa
## # ... with 140 more rows



その他

glimpse

  • データ構造の確認を行う
    • 出力データの列を揃えるなど、str()よりも見やすく表示する
# 準備:irisをtibbleクラスに変換
X <- iris %>% as_tibble() %T>% print()
## # A tibble: 150 × 5
##    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
##           <dbl>       <dbl>        <dbl>       <dbl>  <fctr>
## 1           5.1         3.5          1.4         0.2  setosa
## 2           4.9         3.0          1.4         0.2  setosa
## 3           4.7         3.2          1.3         0.2  setosa
## 4           4.6         3.1          1.5         0.2  setosa
## 5           5.0         3.6          1.4         0.2  setosa
## 6           5.4         3.9          1.7         0.4  setosa
## 7           4.6         3.4          1.4         0.3  setosa
## 8           5.0         3.4          1.5         0.2  setosa
## 9           4.4         2.9          1.4         0.2  setosa
## 10          4.9         3.1          1.5         0.1  setosa
## # ... with 140 more rows
# データ構造の確認
X %>% glimpse()
## Observations: 150
## Variables: 5
## $ Sepal.Length <dbl> 5.1, 4.9, 4.7, 4.6, 5.0, 5.4, 4.6, 5.0, 4.4, 4.9,...
## $ Sepal.Width  <dbl> 3.5, 3.0, 3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1,...
## $ Petal.Length <dbl> 1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5,...
## $ Petal.Width  <dbl> 0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 0.2, 0.1,...
## $ Species      <fctr> setosa, setosa, setosa, setosa, setosa, setosa, ...
# 参考:str関数による表示
X %>% str()
## Classes 'tbl_df', 'tbl' and 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...



all_equal



trunc_mat

mtcars %>% trunc_mat()

data.frame [32 × 11]

mpg cyl disp hp drat wt qsec vs am gear carb
21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4

(with 22 more rows)

inserted by FC2 system