web-dev-qa-db-ger.com

dplyr arrang () - Funktion nach fehlenden Werten sortieren

Ich versuche, Hadley Wickhams R für Data Science durchzuarbeiten, und ich bin auf die folgende Frage gestoßen: "Wie könnten Sie arrang () verwenden, um alle fehlenden Werte an den Anfang zu sortieren? (Hinweis: use is.na () ) " Ich verwende den Flights - Datensatz, der im Paket nycflights13 enthalten ist. In Anbetracht dessen, dass arrang () alle unbekannten Werte am unteren Rand des Datenrahmens sortiert, bin ich nicht sicher, wie man das Gegenteil über die fehlenden Werte aller Variablen tun würde. Mir ist klar, dass diese Frage mit dem Basiscode R beantwortet werden kann, aber ich bin besonders daran interessiert, wie dies mit Hilfe von dplyr und einem Aufruf der Funktionen array () und is.na () geschehen würde. Vielen Dank.

8
T. Gross

Wir können es mit desc umschließen, um die fehlenden Werte am Anfang zu erhalten

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)))

Die NA-Werte wurden nur in diesen Variablen basierend auf gefunden 

names(flights)[colSums(is.na(flights)) >0]
#[1] "dep_time"  "dep_delay" "arr_time"  "arr_delay" "tailnum"   "air_time" 

Anstatt jeden Variablennamen gleichzeitig zu übergeben, können Sie auch NSE arrange_ verwenden.

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>.

Aktualisieren

Mit den neueren Versionen von tidyverse (dplyr_0.7.3, rlang_0.1.2) können wir auch arrange_at, arrange_all, arrange_if verwenden.

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

Oder benutze 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
7
akrun

Versuchen Sie es am einfachsten, was er Ihnen gerade gezeigt hat:

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

Die anderen Verknüpfungen von Nizza:

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

oder

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

Im Folgenden werden die Zeilen in absteigender Reihenfolge nach ihrer Anzahl von NAs angeordnet:

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>
2
Frederick Solt

Lösung von @akrun funktioniert gut. arrange_ ist jedoch veraltete SE-Versionen von Hauptverben. Um dies zu vermeiden, können wir eval verwenden.

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