Хобрук: Ваш путь к мастерству в программировании

Как сортировать, ставя NA на первое место в 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, сначала поставив NAs:

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 ставятся последними на arrange.

Лучший хак, который я нашел до сих пор, это сочетание slice со старым добрым 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

Какой dplyr способ получить указанный выше результат?

11.04.2017

Ответы:


1

Мы можем arrange в векторе logical сначала перед упорядочиванием столбца '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
11.04.2017
  • Какая умная мысль-спасибо большое 15.12.2017
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..