2016-07-07 31 views
6

Tôi đang thực hiện filter() sử dụng %in% nhưng cách dplyr dịch truy vấn có vẻ không chính xác. Thực tế, toán tử %in% hoạt động tốt với nhiều giá trị, nhưng nó không chỉ khi có một phần tử duy nhất. Trong kịch bản ban đầu của tôi, các giá trị lọc là động, vì vậy tôi muốn có một hàm hoạt động trong cả hai trường hợp.Làm cách nào để lọc bảng từ xa dựa trên một giá trị duy nhất?

my_db <- src_mysql(dbname = "dplyr", 
        host = "dplyr.csrrinzqubik.us-east-1.rds.amazonaws.com", 
        port = 3306, 
        user = "dplyr", 
        password = "dplyr") 
tbl(my_db, "dplyr") %>% filter(carrier %in% c("UA","AA")) #works 
tbl(my_db, "dplyr") %>% filter(carrier %in% c("UA")) #doesn't work 

Câu hỏi của tôi trùng lặp với multiple selectInput values create unexpected dplyr (postgres) behavior. Có vẻ như this issue cũng nổi tiếng quá

+2

Phiên bản nào của dplyr? Cấu trúc bản dịch SQL thay đổi trong 0.5.0. – alistaire

+0

@alistaire Tôi đã sử dụng 4.3, bây giờ tôi đã cập nhật nhưng vấn đề vẫn còn đó. – Dambo

+2

bạn có thể hack xung quanh điều này bằng cách sử dụng '...% trong% c (" Nghệ thuật "," some_absent_junk ")'? (không đạt yêu cầu, nhưng có thể hữu ích như một cách giải quyết) –

Trả lời

0

Kết hợp một số đề xuất, cách tiếp cận tốt nhất cho kịch bản của tôi có thể là cách tiếp cận bên dưới. Lý do tại sao tôi không thích làm tổ số filter() trong câu hỏi if, là tôi có nhiều mục filter từ các mục menu của ứng dụng sáng bóng. Vì vậy, thao tác biến tại nguồn tiết kiệm cho tôi rất nhiều cách gõ.

a <- c("UA") 
b <- if(length(a)>1) a else c(a,"") 
tbl(my_db, "dplyr") %>% 
    filter(carrier %in% b) 

Hoặc

a <- c("UA") 
varToFilterFor <- rep(a ,2) 
tbl(my_db, "dplyr") %>% 
     filter(carrier %in% varToFilterFor) 
3

Tôi không thể cung cấp bất kỳ thông tin chi tiết nào về lý do mã của bạn không thành công. Nhưng cho đến khi ai đó có thể cung cấp một giải pháp tốt hơn, đây là một công việc đơn giản xung quanh cung cấp "một chức năng hoạt động trong cả hai trường hợp".

my.carriers <- c("UA","AA") 
my.carriers <- c("UA") 

if (length(my.carriers)>1) { 
    tbl(my_db, "dplyr") %>% filter(carrier %in% my.carriers) 
} else { 
    tbl(my_db, "dplyr") %>% filter(carrier == my.carriers) 
} 
+0

Có đây là những gì được đề xuất trong liên kết tôi đã thêm vào câu hỏi của mình. Tôi đang xem xét ifelse() 'quá, nhưng tôi không chắc chắn liệu nó sẽ là tương đương về hiệu suất. – Dambo

+0

Tôi đã cố gắng 'ifelse' làm nỗ lực đầu tiên của mình - tôi không thể làm cho nó hoạt động. nó dường như không chờ trả lời truy vấn vì lý do nào đó – dww

+0

Nó có thể là do sự vector hóa của 'ifelse' mà" trả về một giá trị có cùng hình dạng như kiểm tra ". Ví dụ này đã giúp tôi hiểu tại sao nó không hoạt động 'd <- c (" AA "," AA "," EV "," DL ") a <- c (" UA "," AA ") ifelse (chiều dài (a)> 1, d% trong% a, d == a) nếu (chiều dài (a)> 1) {d% trong% a} khác {d == a} ' – Dambo

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