我试图找出如何有效地选择列使用dplyr::select_if.starwarsdplyr 0.70中的数据集是一个很好的数据集,用于此:
> starwars
# A tibble: 87 x 13
name height mass hair_color skin_color eye_color birth_year gender homeworld species films vehicles starships
<chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr> <chr> <list> <list> <list>
1 Luke Skywalker 172 77 blond fair blue 19.0 male Tatooine Human <chr [5]> <chr [2]> <chr [2]>
2 C-3PO 167 75 <NA> gold yellow 112.0 <NA> Tatooine Droid <chr [6]> <chr [0]> <chr [0]>
3 R2-D2 96 32 <NA> white, blue red 33.0 <NA> Naboo Droid <chr [7]> <chr [0]> <chr [0]>
4 Darth Vader 202 136 none white yellow 41.9 male Tatooine Human <chr [4]> <chr [0]> <chr [1]>
5 Leia Organa 150 49 brown light brown 19.0 female Alderaan Human <chr [5]> <chr [1]> <chr [0]>
6 Owen Lars 178 120 brown, grey light blue 52.0 male Tatooine Human <chr [3]> <chr [0]> <chr [0]>
7 Beru Whitesun lars 165 75 brown light blue 47.0 female Tatooine Human <chr [3]> <chr [0]> <chr [0]>
8 R5-D4 97 32 <NA> white, red red NA <NA> Tatooine Droid <chr [1]> <chr [0]> <chr [0]>
9 Biggs Darklighter 183 84 black light brown 24.0 male Tatooine Human <chr [1]> <chr [0]> <chr [1]>
10 Obi-Wan Kenobi 182 77 auburn, white fair blue-gray 57.0 male Stewjon Human <chr [6]> <chr [1]> <chr [5]>
Run Code Online (Sandbox Code Playgroud)
现在说我想选择只有整数的列.这很好用:
library(dplyr)
starwars %>%
select_if(is.numeric)
Run Code Online (Sandbox Code Playgroud)
但是,如果我想根据多个标准进行选择,该怎么办?例如,我可能想要数字和字符列:
starwars %>%
select_if(c(is.numeric, is.character))
Run Code Online (Sandbox Code Playgroud)
或许我想要所有数字和name列:
starwars %>%
select_if(name, is.character)
Run Code Online (Sandbox Code Playgroud)
上面两个例子都没有用,所以我想知道如何完成我在这里概述的内容.
对于第一个例子:
starwars %>%
select_if(function(col) {is.numeric(col) | is.character(col)})
Run Code Online (Sandbox Code Playgroud)
这是直接从RDocumentation页面获取的.
对于第二个:
toKeep <- sapply(starwars, is.numeric)
starwars %>%
select("name", names(toKeep)[as.numeric(toKeep) == 1])
Run Code Online (Sandbox Code Playgroud)
我目前无法做出更漂亮的东西,但我确信有更好的方法:)
使用函数时,优雅的 tidyverse 语法 where~代表匿名函数可能会有所帮助select_if:
require(tidyverse)
# numeric and character columns
starwars %>% select_if(~ is.numeric(.) | is.character(.))
# all numeric AND the name column
starwars %>% select(name, where(is.numeric))
Run Code Online (Sandbox Code Playgroud)
根据 tidyverse 创建者的说法,由于某种原因,建议将谓词函数(例如,is.numeric在 of 内部)select包裹起来。where()