2017-12-30 111 views
5

Tôi muốn chọn các cột bằng cách sử dụng các tên màu và các giá trị của chúng trong một chuỗi ống đơn mà không đề cập đến các đối tượng khác, chẳng hạn như NAMES <- names(d). Tôi có thể làm điều đó với select_if() không?dplyr :: select_if có thể sử dụng tên và giá trị của chúng cùng một lúc?

Ví dụ:

Tôi có thể sử dụng tên màu để chọn cols.
(select(matches(...)) thông minh hơn chỉ xử lý các tên họ).

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

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

Và tôi có thể sử dụng các giá trị.

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

Nhưng cách sử dụng cả hai? (đặc biệt là OR)
Mã dưới đây là những gì tôi muốn (tất nhiên, không chạy).

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

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

6

Một cách giải quyết mà không phải là quá phức tạp là:

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

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

cho nào:

# 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

Cám ơn câu trả lời của bạn! Tôi đã được strugging để lambda chức năng nhưng nó không phải là cần thiết. – cuttlefish44

+1

@ cuttlefish44, chắc chắn rồi. Vấn đề của hàm là hàm trong '.predicate' được áp dụng cho các cột và bằng cách này chúng ta mất thông tin về tên. – mt1022

+2

Tùy chọn khác là 'd%>% chọn (kết quả (" Cánh hoa "), tên (mà (bản đồ (., Trung bình)> 5)))' – akrun

Các vấn đề liên quan