2017-12-30 74 views
5

NAMES <- names(d)과 같이 다른 객체를 참조하지 않고 단일 파이프 체인에서 colnames와 해당 값을 사용하여 cols를 선택하려고합니다. select_if()으로 해결할 수 있습니까?dplyr :: select_if는 동시에 colnames와 해당 값을 사용할 수 있습니까?

예 :

필자는 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

오징어 44. 함수의 문제는'.predicate'의 함수가 칼럼에 적용되고 이런 방법으로 우리는 이름의 정보를 잃어버린다는 것입니다. – mt1022

+2

또 다른 옵션은'd %> % select (일치하는 "Petal")이고, 이름은 (map (., mean)> 5))' – akrun