導入編

登録関数

# 登録数
ls("package:magrittr") %>% length()
[1] 35
# 関数一覧
ls("package:magrittr") %>% print()
 [1] "%$%"                    "%<>%"                  
 [3] "%>%"                    "%T>%"                  
 [5] "add"                    "and"                   
 [7] "debug_fseq"             "debug_pipe"            
 [9] "divide_by"              "divide_by_int"         
[11] "equals"                 "extract"               
[13] "extract2"               "freduce"               
[15] "functions"              "inset"                 
[17] "inset2"                 "is_greater_than"       
[19] "is_in"                  "is_less_than"          
[21] "is_weakly_greater_than" "is_weakly_less_than"   
[23] "mod"                    "multiply_by"           
[25] "multiply_by_matrix"     "n'est pas"             
[27] "not"                    "or"                    
[29] "raise_to_power"         "set_colnames"          
[31] "set_names"              "set_rownames"          
[33] "subtract"               "undebug_fseq"          
[35] "use_series"            



パイプ演算子

** %>% **

  • プログラムを連鎖させる
    • いわゆるパイプ演算子と呼ばれるもの
# パイプでつなぐ
iris %>% 
  group_by(Species) %>% 
  tally()
## # A tibble: 3 × 2
##      Species     n
##       <fctr> <int>
## 1     setosa    50
## 2 versicolor    50
## 3  virginica    50



** %T>% **

  • フレーズを1つ飛ばしてパイプをつなげる
    • チャートなどを途中で描きたい場合
    • str()など戻り値が元のデータセットと異なる場合
iris %>% 
  group_by(Species) %T>% 
  plot() %>% 
  tally()

## # A tibble: 3 × 2
##      Species     n
##       <fctr> <int>
## 1     setosa    50
## 2 versicolor    50
## 3  virginica    50



** %$% **

  • 次のフレーズの全体にデータをつなぐ
    • 相関係数など複数の箇所で元データを使う場合
# 相関係数を求める
iris %$% cor(Sepal.Length, Sepal.Width)
## [1] -0.1175698



** %<>% **

  • 最終的なデータを元のデータセットに上書き
# 準備:データセットの作成
X <- iris %>% head(5) %T>% print()
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 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
# 元のデータセットの上書き
X %<>% head(3) %>% select(-Species)
X %>% print()
##   Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1          5.1         3.5          1.4         0.2
## 2          4.9         3.0          1.4         0.2
## 3          4.7         3.2          1.3         0.2



名前設定

ポイント

  • 名前設定は最もパイプライクでない処理なので非常に重宝する
  • {tibble}でも類似した趣旨の関数が存在するので適宜参照



set_colnames

  • 列名を変更する
    • 列名の指定は通常「colnames<-」とするので、全くパイプライクではない
# 準備:データセットの作成
X <- tibble(col_1 = 1:5, 
            col_2 = 11:15) %>% print()
## # A tibble: 5 × 2
##   col_1 col_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15
# 列名を変更
X %>% set_colnames(c("COL_1", "COL_2"))
## # A tibble: 5 × 2
##   COL_1 COL_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15



set_rownames

  • 行名を変更する
    • 行名の指定は通常「rownames<-」とするので、全くパイプライクではない
    • tibbleクラスでは行名の指定に「set_rownames」を使うのは非推奨
# 準備:データセットの作成
X <- tibble(col_1 = 1:5, 
            col_2 = 11:15) %>% print()
## # A tibble: 5 × 2
##   col_1 col_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15
# 行名を変更
X %>% as.data.frame() %>% set_rownames(paste0("ROW_", 1:5))
##       col_1 col_2
## ROW_1     1    11
## ROW_2     2    12
## ROW_3     3    13
## ROW_4     4    14
## ROW_5     5    15



set_names

  • ベクトルの要素名を変更する
# 準備:データセットの作成
X <- tibble(col_1 = 1:5, 
            col_2 = 11:15) %>% print()
## # A tibble: 5 × 2
##   col_1 col_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15
# 要素名の変更
X$col_1 %>% set_names(LETTERS[1:5])
## A B C D E 
## 1 2 3 4 5



データ抽出

ポイント

  • データ抽出も演算子で行うことが多く、パイプライクとは言えない
  • ただし、{dplyr}{purrr}{rlist}などでも多数の関数がサポートされている



extract

  • ベクトルの要素にアクセスする
  • データフレームの一部を抽出する
    • [演算子と同様
    • 関数名が{magrittr}と{tidyr}で重複している点に注意
    • {dplyr}でもデータ抽出の関数は充実している
# ベクトルの要素を抽出
iris$Sepal.Length %>% magrittr::extract(1:10)
##  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9
# データフレームの要素を抽出
# --- 行指定
# --- extract(1:3, )とするとRstudioが警告を出す
iris %>% as_tibble() %>% magrittr::extract(1:3, )
## # A tibble: 3 × 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
iris %>% as_tibble() %>% slice(1:3)
## # A tibble: 3 × 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
# データフレームの要素を抽出
# --- 列指定
# --- extract(, 1:3)とするとRstudioが警告を出す
# --- extract(1:3)なら問題なし
iris %>% as_tibble() %>% magrittr::extract(1:3)
## # A tibble: 150 × 3
##    Sepal.Length Sepal.Width Petal.Length
##           <dbl>       <dbl>        <dbl>
## 1           5.1         3.5          1.4
## 2           4.9         3.0          1.4
## 3           4.7         3.2          1.3
## 4           4.6         3.1          1.5
## 5           5.0         3.6          1.4
## 6           5.4         3.9          1.7
## 7           4.6         3.4          1.4
## 8           5.0         3.4          1.5
## 9           4.4         2.9          1.4
## 10          4.9         3.1          1.5
## # ... with 140 more rows
# データフレームの要素を抽出
# --- 行列指定
iris  %>% as_tibble() %>% magrittr::extract(1:3, 1:3)
## # A tibble: 3 × 3
##   Sepal.Length Sepal.Width Petal.Length
##          <dbl>       <dbl>        <dbl>
## 1          5.1         3.5          1.4
## 2          4.9         3.0          1.4
## 3          4.7         3.2          1.3



extract2

# 準備1:リストの作成
# --- リスト要素はベクトル
X <- iris %$% list(Sepal.Length, Sepal.Width) %T>% print()

# 準備2:リストの作成
# --- リスト要素はデータフレーム
Y <- iris %$% list(Sepal.Length, Sepal.Width) %>% map(as_tibble) %T>% print()


# リストから要素抽出
# --- ベクトルで出力
X %>% extract2(1)

# リストから要素抽出
# --- データフレームで出力
Y %>% extract2(1)


# データフレームから抽出
# --- 複数列は指定できない
iris %>% magrittr::extract2("Species")



use_series

  • リストやデータフレームから要素をベクトル形式で抽出
    • 「$」演算子と同様
    • リストの場合は要素名がついている必要がある
# 準備:リストの作成
X <- iris %>% map(list) %>% map(as_vector) %>% map(head, 10) %T>% print()
## $Sepal.Length
##  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9
## 
## $Sepal.Width
##  [1] 3.5 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1
## 
## $Petal.Length
##  [1] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5
## 
## $Petal.Width
##  [1] 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1
## 
## $Species
##  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
## Levels: setosa versicolor virginica
# リストから要素を抽出
X %>% use_series(Sepal.Length)
##  [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9
# データフレームの列をベクトル形式で抽出
iris %>% use_series(Species)
##   [1] setosa     setosa     setosa     setosa     setosa     setosa    
##   [7] setosa     setosa     setosa     setosa     setosa     setosa    
##  [13] setosa     setosa     setosa     setosa     setosa     setosa    
##  [19] setosa     setosa     setosa     setosa     setosa     setosa    
##  [25] setosa     setosa     setosa     setosa     setosa     setosa    
##  [31] setosa     setosa     setosa     setosa     setosa     setosa    
##  [37] setosa     setosa     setosa     setosa     setosa     setosa    
##  [43] setosa     setosa     setosa     setosa     setosa     setosa    
##  [49] setosa     setosa     versicolor versicolor versicolor versicolor
##  [55] versicolor versicolor versicolor versicolor versicolor versicolor
##  [61] versicolor versicolor versicolor versicolor versicolor versicolor
##  [67] versicolor versicolor versicolor versicolor versicolor versicolor
##  [73] versicolor versicolor versicolor versicolor versicolor versicolor
##  [79] versicolor versicolor versicolor versicolor versicolor versicolor
##  [85] versicolor versicolor versicolor versicolor versicolor versicolor
##  [91] versicolor versicolor versicolor versicolor versicolor versicolor
##  [97] versicolor versicolor versicolor versicolor virginica  virginica 
## [103] virginica  virginica  virginica  virginica  virginica  virginica 
## [109] virginica  virginica  virginica  virginica  virginica  virginica 
## [115] virginica  virginica  virginica  virginica  virginica  virginica 
## [121] virginica  virginica  virginica  virginica  virginica  virginica 
## [127] virginica  virginica  virginica  virginica  virginica  virginica 
## [133] virginica  virginica  virginica  virginica  virginica  virginica 
## [139] virginica  virginica  virginica  virginica  virginica  virginica 
## [145] virginica  virginica  virginica  virginica  virginica  virginica 
## Levels: setosa versicolor virginica



算術演算

ポイント

  • 関数名が直観的なので、簡単な処理には便利
    • 加算などの簡単な処理に無名関数は大げさ(無駄に分かりにくい)
    • 無名関数で代替可能な処理が多い
    • 無名関数の方が柔軟な処理にも対応可能



add

  • データセット全体に加算を適用する
# 準備:データセットの作成
X <- tibble(col_1 = 1:5, 
            col_2 = 11:15) %>% print()
## # A tibble: 5 × 2
##   col_1 col_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15
# パイプライクに記述
X %>% add(1)
##   col_1 col_2
## 1     2    12
## 2     3    13
## 3     4    14
## 4     5    15
## 5     6    16
# 参考:add関数を使わない場合
X %>% sapply(function(x) x + 1)
##      col_1 col_2
## [1,]     2    12
## [2,]     3    13
## [3,]     4    14
## [4,]     5    15
## [5,]     6    16



subtract

  • データセット全体に減算を適用する
# 準備:データセットの作成
X <- tibble(col_1 = 1:5, 
            col_2 = 11:15) %>% print()
## # A tibble: 5 × 2
##   col_1 col_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15
# パイプライクに記述
X %>% subtract(1)
##   col_1 col_2
## 1     0    10
## 2     1    11
## 3     2    12
## 4     3    13
## 5     4    14
# 参考:subtract関数を使わない場合
X %>% sapply(function(x) x - 1)
##      col_1 col_2
## [1,]     0    10
## [2,]     1    11
## [3,]     2    12
## [4,]     3    13
## [5,]     4    14



multiply_by

  • データセット全体に積算を適用する
# 準備:データセットの作成
X <- tibble(col_1 = 1:5, 
            col_2 = 11:15) %>% print()
## # A tibble: 5 × 2
##   col_1 col_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15
# パイプライクに記述
X %>% multiply_by(10)
##   col_1 col_2
## 1    10   110
## 2    20   120
## 3    30   130
## 4    40   140
## 5    50   150
# 参考:multiply_by関数を使わない場合
X %>% sapply(function(x) x * 10)
##      col_1 col_2
## [1,]    10   110
## [2,]    20   120
## [3,]    30   130
## [4,]    40   140
## [5,]    50   150



divide_by

  • データセット全体に除算を適用する
# 準備:データセットの作成
X <- tibble(col_1 = 1:5, 
            col_2 = 11:15) %>% print()
## # A tibble: 5 × 2
##   col_1 col_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15
# パイプライクに記述
X %>% divide_by(2)
##   col_1 col_2
## 1   0.5   5.5
## 2   1.0   6.0
## 3   1.5   6.5
## 4   2.0   7.0
## 5   2.5   7.5
# 参考:divide_by関数を使わない場合
X %>% sapply(function(x) x / 2)
##      col_1 col_2
## [1,]   0.5   5.5
## [2,]   1.0   6.0
## [3,]   1.5   6.5
## [4,]   2.0   7.0
## [5,]   2.5   7.5



divide_by_int

  • データセット全体に除算(切り捨て整数)を適用する
# 準備:データセットの作成
X <- tibble(col_1 = 1:5, 
            col_2 = 11:15) %>% print()
## # A tibble: 5 × 2
##   col_1 col_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15
# パイプライクに記述
X %>% divide_by_int(2)
##   col_1 col_2
## 1     0     5
## 2     1     6
## 3     1     6
## 4     2     7
## 5     2     7
# 参考:divide_by関数を使わない場合
X %>% sapply(function(x) floor(x / 2))
##      col_1 col_2
## [1,]     0     5
## [2,]     1     6
## [3,]     1     6
## [4,]     2     7
## [5,]     2     7



mod

  • 指定した数で割り算した時の商を求める
# 準備:データセットの作成
X <- tibble(col_1 = 1:5, 
            col_2 = 11:15) %>% print()
## # A tibble: 5 × 2
##   col_1 col_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15
# パイプライクに記述
X %>% mod(2)
##   col_1 col_2
## 1     1     1
## 2     0     0
## 3     1     1
## 4     0     0
## 5     1     1
# 参考:divide_by関数を使わない場合
X %>% sapply(function(x) x %% 2)
##      col_1 col_2
## [1,]     1     1
## [2,]     0     0
## [3,]     1     1
## [4,]     0     0
## [5,]     1     1



raise_to_power

  • データセット全体に乗法を適用する
# 準備:データセットの作成
X <- tibble(col_1 = 1:5, 
            col_2 = 11:15) %>% print()
## # A tibble: 5 × 2
##   col_1 col_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15
# パイプライクに記述
X %>% raise_to_power(2)
##      col_1 col_2
## [1,]     1   121
## [2,]     4   144
## [3,]     9   169
## [4,]    16   196
## [5,]    25   225
# 参考:divide_by関数を使わない場合
X %>% sapply(function(x) x ^ 2)
##      col_1 col_2
## [1,]     1   121
## [2,]     4   144
## [3,]     9   169
## [4,]    16   196
## [5,]    25   225



multiply_by_matrix

# 準備:データセットの作成
X <- tibble(col_1 = 1:5, 
            col_2 = 11:15) %>% print()
## # A tibble: 5 × 2
##   col_1 col_2
##   <int> <int>
## 1     1    11
## 2     2    12
## 3     3    13
## 4     4    14
## 5     5    15



freduce

  • 以下の関数はとおっているが、使い方のポイントは情報がなく不明
1:10 %>% freduce(list(f = sum))
## [1] 55



比較演算

ポイント

  • ベクトル要素の比較もパイプライクでない処理なので重宝する
    • 複文の中で関数を定義することで表現することも可能



equals

  • イコールかどうかを判定
# 準備:データセットの作成
X <- c(1, 2, 3)
Y <- c(1, 2, 4)

# イコールかどうかを判定
X %>% equals(Y)
## [1]  TRUE  TRUE FALSE
# 参考:equal関数を使わない場合
X %>% {
  a <- function(x) x == Y
  a(.)
}
## [1]  TRUE  TRUE FALSE



is_greater_than

  • 比較して大きいかどうかを判定
    • >演算子と同様
    • イコールはFALSE
# 準備:データセットの作成
X <- c(1, 3, 4)
Y <- c(1, 2, 5)

# イコールかどうかを判定
X %>% is_greater_than(Y)
## [1] FALSE  TRUE FALSE



is_less_than

  • 比較して小さいかどうかを判定
    • <演算子と同様
    • イコールはFALSE
# 準備:データセットの作成
X <- c(1, 3, 4)
Y <- c(1, 2, 5)

# イコールかどうかを判定
X %>% is_less_than(Y)
## [1] FALSE FALSE  TRUE



is_weakly_greater_than

  • 比較して大きいかどうかを判定
    • >=演算子と同様
    • イコールはTRUE
# 準備:データセットの作成
X <- c(1, 3, 4)
Y <- c(1, 2, 5)

# イコールかどうかを判定
X %>% is_weakly_greater_than(Y)
## [1]  TRUE  TRUE FALSE



is_weakly_less_than

  • 比較して大きいかどうかを判定
    • <=演算子と同様
    • イコールはTRUE
# 準備:データセットの作成
X <- c(1, 3, 4)
Y <- c(1, 2, 5)

# イコールかどうかを判定
X %>% is_weakly_less_than(Y)
## [1]  TRUE FALSE  TRUE



is_in

  • 要素が含まれるかどうかを判定
# 準備:データセットの作成
X <- c(1, 2, 3)
Y <- c(1, 2, 4)

# イコールかどうかを判定
X %>% is_in(Y)
## [1]  TRUE  TRUE FALSE



inserted by FC2 system