【问题标题】:How to sort putting NAs first in dplyr? [duplicate]如何在 dplyr 中排序将 NAs 放在首位? [复制]
【发布时间】:2017-09-06 16:51:57
【问题描述】:

考虑以下示例:

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

我想将tibbleval 排序,将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

不幸的是,NAs 被 arrange 放在最后。

到目前为止,我发现的最好的 hack 是将 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 得到上述结果的方式是什么?

【问题讨论】:

    标签: r sorting dplyr na


    【解决方案1】:

    我们可以先在logical 向量上arrange,然后再安排“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
    

    【讨论】:

    • 好聪明的主意——非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 2015-01-29
    • 2019-03-09
    相关资源
    最近更新 更多