2017-04-11 18 views
1

請看下面的例子:如何將NAs首先放入dplyr?

require(tibble) 
require(dplyr) 

set.seed(42) 

tbl <- data_frame(id = letters[1:10], val = c(runif(5), NA, runif(4))) 

tbl 
# A tibble: 10 × 2 
     id   val 
    <chr>  <dbl> 
1  a 0.9148060435 
2  b 0.9370754133 
3  c 0.2861395348 
4  d 0.8304476261 
5  e 0.6417455189 
6  f   NA 
7  g 0.5190959491 
8  h 0.7365883146 
9  i 0.1346665972 
10  j 0.6569922904 

我想tibble通過val進行排序,把NA第一個:

tbl %>% 
    arrange(val) 
# A tibble: 10 × 2 
     id   val 
    <chr>  <dbl> 
1  i 0.1346665972 
2  c 0.2861395348 
3  g 0.5190959491 
4  e 0.6417455189 
5  j 0.6569922904 
6  h 0.7365883146 
7  d 0.8304476261 
8  a 0.9148060435 
9  b 0.9370754133 
10  f   NA 

不幸的是,NA S被放在最後arrange

我迄今發現的最好的手段是用好老order結合slice

tbl %>% 
    slice(order(.$val, na.last = FALSE)) 
# A tibble: 10 × 2 
     id   val 
    <chr>  <dbl> 
1  f   NA 
2  i 0.1346665972 
3  c 0.2861395348 
4  g 0.5190959491 
5  e 0.6417455189 
6  j 0.6569922904 
7  h 0.7365883146 
8  d 0.8304476261 
9  a 0.9148060435 
10  b 0.9370754133 

什麼是dplyr的方式來獲得上述結果?

回答

3

我們可以arrangelogical向量第安排「VAL」列

tbl %>% 
    arrange(!is.na(val), val) 
# A tibble: 10 × 2 
#  id  val 
# <chr>  <dbl> 
#1  f  NA 
#2  i 0.1346666 
#3  c 0.2861395 
#4  g 0.5190959 
#5  e 0.6417455 
#6  j 0.6569923 
#7  h 0.7365883 
#8  d 0.8304476 
#9  a 0.9148060 
#10  b 0.9370754 
+1

這樣一個聰明的想法之前 - 這麼多的感謝 – zlipp