2017-06-15 12 views
4

dplyr::select_ifを使用して列を効率的に選択する方法を理解しようとしています。 dplyr 0.70に設定されたstarwarsデータは、このために使用するのは良いデータセットされています。今、私は唯一の整数であり、選択した列をたいと言っdplyrの複数の属性条件に基づいて列を選択してください。

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

。これはうまくいく:

library(dplyr) 

starwars %>% 
    select_if(is.numeric) 

しかし、私は複数の基準に基づいて選択したい場合はどうすればよいですか?

starwars %>% 
    select_if(name, is.character) 

作業上記の2つの例のどちらもが、私はどのように私はかもしれない疑問に思って:

starwars %>% 
    select_if(c(is.numeric, is.character)) 

それとも、私はすべての数値およびname列をしたい:たとえば、多分私は両方の数値と文字列が欲しいです私がここで概説したことを達成する。最初例えば

+1

関連の質問と回答[こちら](https://stackoverflow.com/questions/39592879/r-dpylr-select-if-with-multiple-conditions) – aosmith

答えて

4

は:

starwars %>% 
    select_if(function(col) {is.numeric(col) | is.character(col)}) 

これはRDocumentationページから直接取得されます。第二のために

toKeep <- sapply(starwars, is.numeric) 
starwars %>% 
    select("name", names(toKeep)[as.numeric(toKeep) == 1]) 

私は、現時点ではアップきれいなものを作ることはできませんが、私は良い方法があると確信している:)

+0

確かに、これはすべての数値には答えられませんが、 AND 'name'列の質問です。そこにはどんな考えがありますか? – boshek

+0

オプション:starwars%>%group_by(name)%>%select_if(is.numeric)。しかし、それは少し醜いです。 – boshek

+0

ええ、申し訳ありません、それは私が思ったよりも少し時間がかかりました。更新された回答をご覧ください。 – herbaman

2

あなたがあなた自身の関数を書くことができ、次のいずれか

to_keep <- function(x) is.numeric(x) | is.character(x) 
starwars %>% select_if(to_keep) 

か、 "quosureスタイルのラムダ関数" を使用することができます

starwars %>% select_if(funs(is.numeric(.) | is.character(.))) 

私は、列選択のためのさまざまなロジックを組み合わせるための良い方法を知らないので、私は(あなたが最初のデータセットを繰り返す持っているとして、それは非常にエレガントではない場合でも)、ハイブリッドアプローチを使用したい:

starwars %>% 
    select("name") %>% 
    bind_cols(select_if(starwars, funs(is.numeric(.) | is.character(.)))) 
+1

どのように数値データで名前とすべての列を選択することができますか? – boshek

+0

@boshek私の更新答えを見てください – sinQueso

関連する問題