2017-12-30 21 views
5

NAMES <- names(d)のように、他のオブジェクトを参照することなく、単一のパイプチェーンでcolnamesとその値を使用してcolsを選択したいとします。 select_if()でこれを行うことはできますか?例えばdplyr :: select_ifは同時にcolnamesとその値を使用できますか?

私はCOLSを選択するために、COLNAMESを使用することができます。
select(matches(...))は、コロン名のみを処理するスマートです)。

library(dplyr) 
d <- iris %>% select(-Species) %>% tibble::as.tibble() 

d %>% select_if(stringr::str_detect(names(.), "Petal")) 

私は値を使用できます。

d %>% select_if(~ mean(.) > 5) 

どのように両方を使用するのですか? (特にOR)
以下のコードは私が望むものです(もちろん、実行しないでください)。

d %>% select_if(stringr::str_detect(names(.), "Petal") | ~ mean(.) > 5) 

ご協力いただければ幸いです。あまりにも複雑ではありません

答えて

6

回避策は次のとおりです。

d %>% select_if(stringr::str_detect(names(.), "Petal") | sapply(., mean) > 5) 

# or 
d %>% select_if(grepl("Petal",names(.)) | sapply(., mean) > 5) 

与える:あなたの答えのための

# A tibble: 150 x 3 
    Sepal.Length Petal.Length Petal.Width 
      <dbl>  <dbl>  <dbl> 
1   5.1   1.4   0.2 
2   4.9   1.4   0.2 
3   4.7   1.3   0.2 
4   4.6   1.5   0.2 
5   5.0   1.4   0.2 
6   5.4   1.7   0.4 
7   4.6   1.4   0.3 
8   5.0   1.5   0.2 
9   4.4   1.4   0.2 
10   4.9   1.5   0.1 
# ... with 140 more rows 
+0

ありがとう!私はラムダ関数に唖然としていたが、それは必要ではない。 – cuttlefish44

+1

@ cuttlefish44、確かに。関数の問題は '.predicate'の関数が列に適用され、このようにして名前の情報が失われることです。 – mt1022

+2

もう一つのオプションは 'd%>%select(" Petal "にマッチする)、名前(map(。、mean)> 5)))' – akrun

関連する問題