2017-04-11 4 views
1

は、次の例を考えてみましょう:dplyrでNAsを最初に並べ替える方法は?

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 

私はNA初を入れ、valによってtibbleをソートしたい:

残念ながら、 NA sはで最後に置かれ
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 

arrange

私がこれまでに見つかった最良のハックは、古き良きordersliceを組み合わせている:

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

私たちは、「ヴァル」列

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

このような巧妙なアイデアを配置する前に、最初のlogicalベクター上arrangeをすることができます - 本当にありがとうございました – zlipp