根据dplyr 0.7.0中的多个属性条件选择列

bos*_*hek 4 r dplyr

我试图找出如何有效地选择列使用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)

上面两个例子都没有用,所以我想知道如何完成我在这里概述的内容.

psy*_*Ole 5

对于第一个例子:

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)

我目前无法做出更漂亮的东西,但我确信有更好的方法:)


Geo*_*sky 2

使用函数时,优雅的 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()