dplyr arrange() 函数按缺失值排序
dplyr arrange() function sort by missing values
我正在尝试研究 Hadley Wickham 的 R for Data Science,但在以下问题上被绊倒了:"How could you use arrange() to sort all missing values to the start? (Hint: use is.na())" 我正在使用 flights 数据集包含在 nycflights13 包中。鉴于 arrange() 将所有未知值排序到数据框的底部,我不确定如何对所有变量的缺失值执行相反的操作。我意识到这个问题可以用基本的 R 代码来回答,但我特别感兴趣的是如何使用 dplyr 和调用 arrange() 和 is.na() 函数来完成这个问题。谢谢。
我们可以用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.3
, rlang_0.1.2
) ,我们也可以使用 arrange_at
, arrange_all
, arrange_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
以下按 NA
的数量降序排列行:
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>
尝试最简单的方法,他刚刚向您展示的方法:
arrange(flights, desc(is.na(dep_time)))
其他不错的快捷方式:
arrange(flights, !is.na(dep_time))
或
arrange(flights, -is.na(dep_time))
@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)
我正在尝试研究 Hadley Wickham 的 R for Data Science,但在以下问题上被绊倒了:"How could you use arrange() to sort all missing values to the start? (Hint: use is.na())" 我正在使用 flights 数据集包含在 nycflights13 包中。鉴于 arrange() 将所有未知值排序到数据框的底部,我不确定如何对所有变量的缺失值执行相反的操作。我意识到这个问题可以用基本的 R 代码来回答,但我特别感兴趣的是如何使用 dplyr 和调用 arrange() 和 is.na() 函数来完成这个问题。谢谢。
我们可以用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.3
, rlang_0.1.2
) ,我们也可以使用 arrange_at
, arrange_all
, arrange_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
以下按 NA
的数量降序排列行:
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>
尝试最简单的方法,他刚刚向您展示的方法:
arrange(flights, desc(is.na(dep_time)))
其他不错的快捷方式:
arrange(flights, !is.na(dep_time))
或
arrange(flights, -is.na(dep_time))
@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)