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.
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>.
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
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))
Im Folgenden werden die Zeilen in absteigender Reihenfolge nach ihrer Anzahl von NA
s 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>
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)