2016-07-07 2 views
6

%in%을 사용하여 filter()을 사용하고 있는데 dplyr이 검색어를 번역하는 방식이 올바르지 않은 것 같습니다. 실제로 %in% 연산자는 두 개 이상의 값을 사용하여 제대로 작동하지만 단일 요소 만있는 경우에는 작동하지 않습니다. 원래 시나리오에서 필터링 값은 동적이므로 두 경우 모두에서 작동하는 함수를 갖고 싶습니다.단일 값을 기반으로 원격 테이블을 필터링하는 방법은 무엇입니까?

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 

제 질문은 multiple selectInput values create unexpected dplyr (postgres) behavior입니다. this issue도 잘 알려져 있습니다.

+2

버전은 무엇? SQL 변환 구조가 0.5.0에서 변경되었습니다. – alistaire

+0

@alistaire 4.3을 사용하고 있었지만 이제는 업데이트를했으나 여전히 문제가 있습니다. – Dambo

+2

% c ("Art", "some_absent_junk")'에서 % ...를 사용하여이 문제를 해킹 할 수 있습니까? (불만족 스럽지만 해결 방법으로 유용 할 수도 있습니다.) –

답변

0

제안 사항 중 일부를 정리하면 내 시나리오에 가장 적합한 방법이 될 수 있습니다. filter()if 문에 중첩시키는 것이 좋지 않은 이유는 반짝이는 응용 프로그램의 메뉴 항목에서 복수 filter입니다. 따라서 소스에서 변수를 조작하면 많은 타이핑을 줄일 수 있습니다.

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

또는 dplyr의

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

코드가 실패한 이유에 대한 통찰력을 제공 할 수 없습니다. 그러나 누군가가 더 나은 해결책을 제공 할 때까지는 "두 경우 모두에서 작동하는 기능"을 제공하는 간단한 해결 방법이 있습니다.

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

예이 질문에 대한 링크에 제안 된 내용입니다. 나는 ifelse()도 고려하고 있지만 성능면에서 동등한 지 확신 할 수 없다. – Dambo

+0

제 1 회 시도로'ifelse'를 시도했습니다 - 제대로 작동하지 못했습니다. 어떤 이유로 쿼리를 응답 할 때까지 기다리는 것 같지 않습니다. – dww

+0

아마도 "ifelse"의 벡터화로 인해 "테스트와 같은 모양의 값을 반환합니다"때문일 수 있습니다. 이 예제는 왜 d '-c ("AA", "AA", "EV", "DL") a <- c ("UA", "AA") ifelse (length (a)> 1) d % in % a} else {d == a}'(길이 (a)> 1, % a, d == a) – Dambo

관련 문제