2017年10月9日 星期一

R的管線%>%與管線套件magrittr

在shell script裡面,可以用 | 來把前面的指令輸出的結果給後面指令使用;在R裡面可以使用 %>% 達成。例如說:
  1. y <- c(0, 4, 2, 8, 2, 5, 7, 5, 4, 3, 5, 5, 0, 2, 9, 6, 2, 7, 8, 5)
    [1] 0 4 2 8 2 5 7 5 4 3 5 5 0 2 9 6 2 7 8 5
  2. sort(unique(unlist(y)))
    [1] 0 2 3 4 5 6 7 8 9
  3. y %>% unlist %>% unique %>% sort
    [1] 0 2 3 4 5 6 7 8 9
  4. y %>%
    unlist %>%
    unique %>%
    sort

    [1] 0 2 3 4 5 6 7 8 9
指令1指定y是一個數列,指令2, 3, 4的意思其實都是一樣的,把數列裡面單獨出現的數字拿出來依照大小排好,但指令4就比2要容易閱讀,也不容易算錯小括號。

下面綠色指令與藍色指令也是相同的意思:
  • sort(unique(unlist(sample(seq(0,9), 20, replace=TRUE))))
  • sample(seq(0,9), 20, replace=TRUE) %>%
    unlist %>%
    unique %>%
    sort
可以看到用管線會比用小括號來說程式碼要容易閱讀的多。

除了預設的%>%,套件magrittr還有其他幾種管線運算子:
  • %>%:左側結果傳給右側,成為第一個參數。這個預設就有不用安裝magrittr
  • %$%:指定data frame裡面的資料,傳給後面做比較
    mtcars %$% cor(disp, mpg)   計算mtcars裡面disp與mpg的相關係數
  • %<>%:左側的結果傳到右方,然後再把算出來的結果塞回左側去
    set.seed(3)
    x <- rnorm(5)
    x <- x %>% abs %>% sqrt

    等同於
    set.seed(3)
    x <- rnorm(5)
    x %<>% abs %>% sqrt
  • %T>%:和指令tee類似,如果想要將一筆資料丟給兩個以上的函數執行,可以用這
    mtcars$disp %T>% plot %>% min  同時用plot畫圖與用min計算最小值

參考資料:

_EOF_

沒有留言:

張貼留言