2017-12-30 13 views
5

Ich möchte cols mit colnames und ihre Werte in einer einzelnen Pipe-Kette ohne Verweis auf andere Objekte, wie NAMES <- names(d) auswählen. Kann ich es mit select_if() tun?dplyr :: select_if kann colnames und ihre Werte gleichzeitig verwenden?

Zum Beispiel

kann ich COLNAMES verwenden cols auszuwählen.
(select(matches(...)) ist schlauer Umgang nur Colnamen).

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

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

Und ich kann die Werte verwenden.

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

Aber wie Sie beide verwenden? (vor allem OR)
Unter Code ist was ich will (natürlich nicht laufen).

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

Jede Hilfe würde sehr geschätzt werden.

Antwort

6

Eine Abhilfe, die nicht zu kompliziert ist:

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

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

Welche gibt:

# 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

Vielen Dank für Ihre Antwort! Ich kämpfte um Lambda-Funktionen, aber es ist nicht notwendig. – cuttlefish44

+1

@ Tintenfisch44, sicher. Das Problem der Funktionen besteht darin, dass die Funktion in '.predicate' auf Spalten angewendet wird und dadurch die Informationen von Namen verloren gehen. – mt1022

+2

Eine andere Option ist 'd%>% select (entspricht (" Petal "), Namen (welche (map (., Mean)> 5))) – akrun

Verwandte Themen