2014-07-07 11 views
10

Tôi muốn để có thể xác định đối số cho dplyr động từĐi qua chuỗi như các đối số trong động từ dplyr

condition <- "dist > 50" 

và sau đó sử dụng các chuỗi trong dplyr chức năng:

require(ggplot2) 
ds <- cars 
ds1 <- ds %>% 
    filter (eval(condition)) 
ds1 

Nhưng nó ném do lỗi

Error: filter condition does not evaluate to a logical vector. 

Mã nên đánh giá là:

ds1<- ds %>% 
    filter(dist > 50) 
    ds1 

Hệ quả là:

DS1

speed dist 
1  14 60 
2  14 80 
3  15 54 
4  18 56 
5  18 76 
6  18 84 
7  19 68 
8  20 52 
9  20 56 
10 20 64 
11 22 66 
12 23 54 
13 24 70 
14 24 92 
15 24 93 
16 24 120 
17 25 85 

Câu hỏi:

Làm thế nào để vượt qua một chuỗi như một cuộc tranh cãi trong một động từ dplyr?

+0

Theo tôi được biết , đây là [công việc đang tiến hành] (https://github.com/hadley/dplyr/issues/352) – AndrewMacDonald

+0

Và bây giờ nó đã hoàn thành và là một phần của quá trình cài đặt 'dplyr' chuẩn. – Gregor

Trả lời

2

Trong khi họ đang làm việc trên đó, đây là một cách giải quyết bằng if:

library(dplyr) 
library(magrittr) 

ds <- data.frame(attend = c(1:5,NA,7:9,NA,NA,12)) 

filter_na <- FALSE 

filtertest <- function(x,filterTF = filter_na){ 
    if(filterTF) x else !(x) 
} 

ds %>% 
    filter(attend %>% is.na %>% filtertest) 

    attend 
1  1 
2  2 
3  3 
4  4 
5  5 
6  7 
7  8 
8  9 
9  12 

filter_na <- TRUE 
ds %>% 
    filter(attend %>% is.na %>% filtertest) 

    attend 
1  NA 
2  NA 
3  NA 
+0

cảm ơn, @AndrewMacDonald! xin lỗi, vì không cung cấp ví dụ có thể tái sản xuất trước đây – andrey

+0

tuyệt vời, nhờ @AndrewMacDonald, công trình này và trên cùng mang lại cho tôi một ví dụ đơn giản về cách sử dụng chức năng với dplyr - thứ tôi muốn có để tham khảo. Cảm ơn một lần nữa! – andrey

+1

vui vì nó hữu ích! Tôi đã chỉnh sửa nó ở trên rất ít (không nên sử dụng '$' trong 'bộ lọc'! – AndrewMacDonald

11

Trong phiên bản tiếp theo của dplyr, nó có thể sẽ làm việc như thế này:

condition <- quote(dist > 50) 

mtcars %>% 
    filter_(condition) 
+0

không thể chờ đợi dplyr giữ tôi ngạc nhiên với tính trực giác và trí thông minh của nó Cảm ơn, Hadley! – andrey

+2

Nó đã có sẵn horaaa – Espanta

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