web-dev-qa-db-ja.com

dplyr Arrange()関数、欠損値によるソート

私はデータサイエンスのためのハドリーウィッカムのRを通して作業しようとしています、そして次の質問につまずきました: "arrange()を使用してすべての欠落した値を最初にソートする方法は?(ヒント:use is.na()) "nylightlights1パッケージに含まれるflightsデータセットを使用しています。配列()がすべての不明な値をデータフレームの下部にソートすることを考えると、すべての変数の欠落した値に対してどのように反対のことをするのかわかりません。この質問にはベースRコードで答えることができると思いますが、dplyrと、arrange()およびis.na()関数の呼び出しを使用してこれを行う方法に特に興味があります。ありがとう。

11
T. Gross

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
10
akrun

彼があなたに示した最も簡単な方法を試してください:

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

その他の素敵なショートカット:

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

または

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

以下は、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
Frederick Solt

@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)
0
Endle_Zhenbo