2016-07-07 31 views
6

我在做filter()使用%in%但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

什么dplyr的版本? SQL翻译结构在0.5.0中更改。 – alistaire

+0

@alistaire我正在使用4.3,现在我已更新,但问题仍然存在。 – Dambo

+2

你可以通过在%c(“Art”,“some_absent_junk”)中使用'...%'来解决这个问题吗? (不满意,但可能有用的解决方法) –

回答

0

把一些建议放在一起,对我的情况来说最好的方法可能是下面的方法。我不喜欢在if声明中嵌套filter()的原因是,我从闪亮应用程序的菜单项中有多个filter。因此,在源处操作变量可以节省大量输入。

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

或者

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

我尝试了'ifelse'作为我的第一次尝试 - 我无法让它工作。它似乎没有等待回复查询出于某种原因 – dww

+0

这可能是由于“ifelse”的向量化,它“返回一个与测试形状相同的值”。这个例子帮助我理解了为什么它不起作用。“d < - c(”AA“,”AA“,”EV“,”DL“) a <-c(”UA“,”AA“)012elifelse (长度(a)> 1){d%in%a} else {d == a}(长度(a)> 1,d%in%a,d == a) – Dambo