我正在使用dplyr的自动SQL后端从数据库表查询子表。& i. w E0 x% D6 h
my_tbl 其中,my_table在数据库中6 u4 o4 T+ D) w
batch_name valuebatch_A_1 1batch_A_2 2batch_A_2 3batch_B_1 8batch_B_2 9...我只想要来自数据batch_A_#,不管数量是多少。$ b( U. j4 l) g" x7 ~
如果我是用SQL可以使用编写的6 O: t. @( ^; q: F; X
select * where batch_name like 'batch_A_%'如果我是在R写下这一点,我可以用一些方法得到:grepl(),%in%或str_detect() ; L& Y, m& D' C, R7 E% R* o0 A* }# option 1subtable % select(batch_name,value) %>% filter(grepl('batch_A_',batch_name,fixed = T))# option 2subtable % select(batch_name,value) %>% filter(str_detect(batch_name,'batch_A_'))所有这些都将产生以下内容Postgres错误: HINT: No function matches the given name and argumenttypes. You might need to add explicit type casts 9 n* v4 J( k7 t" c( @: B" \因此,如何传递SQL帮助生成字符串函数或匹配函数dplyr SQL更灵活的函数范围可用于查询filter?# N1 {9 Y6 o4 h6 I* A
(仅供参考,%in%功能可以正常工作,但需要列出所有可能的值。可结合使用paste列出列表,但不适用于更一般的正则表达式)* V' a. F" R" N* K0 q
x' U. m# ?, u5 g" G解决方案: 6 m( }) I# \/ Y4 A 一个“ dplyr-only解决方案是这样的) n* S; z6 m" p" y* _, h- k; J, M
tbl(my_con,"my_table") %>% filter(batch_name %like% "batch_A_%") %>% collect()完整说明:/ K9 S! f: N* p% f# N p+ x6 {
"my_table") %>% filter(batch_name %like% "batch_A_%") %>% collect()#> # A tibble: 3 x 2#> batch_name value#> * #> 1 batch_A_1 1#> 2 batch_A_2 2#> 3 batch_A_2 3dbDisconnect(my_con)#> [1] TRUE"my_table") %>% filter(batch_name %like% "batch_A_%") %>% collect()#> # A tibble: 3 x 2#> batch_name value#> * #> 1 batch_A_1 1#> 2 batch_A_2 2#> 3 batch_A_2 3dbDisconnect(my_con)#> [1] TRUE之所以可行,是因为dplyr所有不知道如何翻译的函数都会按原样传递。) h) ~5 g. x! L: ?3 }0 r1 Z$ d
?dbplyr::translate\_sql。9 i0 H6 Z+ l. d- ~' f5 s: G
帽尖到@PaulRougieux点击这里为他最近的评论