2017-12-30 157 views
5

Chcę wybrać cols przy użyciu nazw zmiennych i ich wartości w pojedynczym łańcuchu rur bez odwoływania się do innych obiektów, takich jak NAMES <- names(d). Czy mogę to zrobić za pomocą select_if()?dplyr :: select_if może używać nazw zmiennych i ich wartości w tym samym czasie?

Na przykład

mogę używać colnames wybrać cols.
(select(matches(...)) jest inteligentniejsze traktowanie tylko nazw).

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

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

I mogę użyć wartości.

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

Ale jak korzystać z obu? (szczególnie OR)
Poniższy kod jest tym, czego chcę (oczywiście, nie uruchamiaj).

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

Każda pomoc zostanie bardzo doceniona.

Odpowiedz

6

Rozwiązaniem, które nie jest zbyt skomplikowane, to:

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

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

Co daje:

# 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

Dzięki za odpowiedź! Próbowałem funkcji lambda, ale nie jest to konieczne. – cuttlefish44

+1

@ cuttlefish44, na pewno. Problem funkcji polega na tym, że funkcja w '.predicate' jest stosowana do kolumn iw ten sposób tracimy informacje o nazwach. – mt1022

+2

Inną opcją jest 'd%>% select (mecze (" Płatek "), nazwy (które (mapa (., Średnia)> 5)))' – akrun