How to sort putting NAs first in dplyr?

dplyr, na, r, sorting

Solution

We can `arrange` on the `logical` vector first before arranging the 'val' column

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

Problem

Consider the following example: ``` 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 ``` I want to sort the `tibble` by `val`, putting `NA`s first: ``` 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 ``` Unfortunately, the `NA`s are put last by `arrange`. The best hack I found so far is combining `slice` with good old `order`: ``` 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 ``` What's the `dplyr` way to get the above result?

Original source

Related problems