【问题标题】:dplyr arrange() function sort by missing valuesdplyrarrange() 函数按缺失值排序
【发布时间】:2016-10-12 03:36:06
【问题描述】:

我正在尝试研究 Hadley Wickham 的 R for Data Science,但在以下问题上遇到了麻烦:“您如何使用安排 () 将所有缺失值排序到开头?(提示:使用是.na())" 我正在使用 nycflights13 包中包含的 flights 数据集。鉴于安排()将所有未知值排序到数据框的底部,我不确定如何在所有变量的缺失值中做相反的事情。我意识到这个问题可以用基本的 R 代码来回答,但我特别感兴趣的是如何使用 dplyr 和调用 arange() 和 is.na() 函数来完成。谢谢。

【问题讨论】:

  • 你可以使用arrange(dat, desc(is.na(variable)))

标签: r sorting dplyr na


【解决方案1】:

我们可以用desc 包装它以在开始时获取缺失值

flights %>% 
    arrange(desc(is.na(dep_time)),
           desc(is.na(dep_delay)),
           desc(is.na(arr_time)), 
           desc(is.na(arr_delay)),
           desc(is.na(tailnum)),
           desc(is.na(air_time)))

NA 值仅在基于

的变量中找到
names(flights)[colSums(is.na(flights)) >0]
#[1] "dep_time"  "dep_delay" "arr_time"  "arr_delay" "tailnum"   "air_time" 

我们也可以使用 NSE arrange_,而不是一次传递每个变量名

nm1 <- paste0("desc(is.na(", names(flights)[colSums(is.na(flights)) >0], "))")

r1 <- flights %>%
        arrange_(.dots = nm1) 

r1 %>%
   head()
#year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time arr_delay carrier flight tailnum
#  <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>     <dbl>   <chr>  <int>   <chr>
#1  2013     1     2       NA           1545        NA       NA           1910        NA      AA    133    <NA>
#2  2013     1     2       NA           1601        NA       NA           1735        NA      UA    623    <NA>
#3  2013     1     3       NA            857        NA       NA           1209        NA      UA    714    <NA>
#4  2013     1     3       NA            645        NA       NA            952        NA      UA    719    <NA>
#5  2013     1     4       NA            845        NA       NA           1015        NA      9E   3405    <NA>
#6  2013     1     4       NA           1830        NA       NA           2044        NA      9E   3716    <NA>
#Variables not shown: origin <chr>, dest <chr>, air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>,
#  time_hour <time>.

更新

随着 tidyverse 的更新版本(dplyr_0.7.3rlang_0.1.2),我们也可以使用arrange_atarrange_allarrange_if

nm1 <- names(flights)[colSums(is.na(flights)) >0]
r2 <- flights %>% 
          arrange_at(vars(nm1), funs(desc(is.na(.))))

或使用arrange_if

f <- rlang::as_function(~ any(is.na(.)))
r3 <- flights %>% 
          arrange_if(f, funs(desc(is.na(.))))


identical(r1, r2)
#[1] TRUE

identical(r1, r3)
#[1] TRUE

【讨论】:

    【解决方案2】:

    下面将行按NAs 的数量降序排列:

    flights %>% 
        arrange(desc(rowSums(is.na(.))))
    
        # A tibble: 336,776 × 19
        year month   day dep_time sched_dep_time dep_delay arr_time sched_arr_time
       <int> <int> <int>    <int>          <int>     <dbl>    <int>          <int>
    1   2013     1     2       NA           1545        NA       NA           1910
    2   2013     1     2       NA           1601        NA       NA           1735
    3   2013     1     3       NA            857        NA       NA           1209
    4   2013     1     3       NA            645        NA       NA            952
    5   2013     1     4       NA            845        NA       NA           1015
    6   2013     1     4       NA           1830        NA       NA           2044
    7   2013     1     5       NA            840        NA       NA           1001
    8   2013     1     7       NA            820        NA       NA            958
    9   2013     1     8       NA           1645        NA       NA           1838
    10  2013     1     9       NA            755        NA       NA           1012
    # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>, carrier <chr>,
    #   flight <int>, tailnum <chr>, origin <chr>, dest <chr>, air_time <dbl>,
    #   distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
    

    【讨论】:

      【解决方案3】:

      尝试最简单的方法,他刚刚向您展示的内容:

      arrange(flights, desc(is.na(dep_time)))
      

      其他不错的快捷方式:

      arrange(flights, !is.na(dep_time))
      

      arrange(flights, -is.na(dep_time))
      

      【讨论】:

        【解决方案4】:

        @akrun 的解决方案效果很好。但是,arrange_ 是不推荐使用的主要动词的 SE 版本。为了避免它,我们可以使用eval

        nmf <- names(flights)[colSums(is.na(flights)) > 0]
        rules = paste0("!is.na(", nmf, ")")
        rc <- paste(rules, collapse = ",")
        arce <-  paste("arrange(flights," , rc , ")")
        expr <- parse(text = arce)
        ret <- eval(expr)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-06-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-08
          • 2020-11-21
          • 2014-05-09
          • 1970-01-01
          相关资源
          最近更新 更多