微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

postgres使用幻灯片窗口生成数组

如何解决postgres使用幻灯片窗口生成数组

我正试图弄清楚如何使用Postgre在给定字符列上的滑动窗口的情况下查询生成ARRAY。

例如,如果我有这个:

   pid           
   <chr>         
 1 WP_096038768.1
 2 WP_013465871.1
 3 WP_058155244.1
 4 WP_011329269.1
 5 WP_058374608.1
 6 WP_089368983.1
 7 WP_096739105.1
 8 WP_089346667.1
 9 WP_096041177.1
10 WP_010553306.1
...

我想要在该行前后放置一个大小为1的滑动窗口。 结果是这样的:

   pid            g                                           
   <chr>          <chr>                                       
 1 WP_013465871.1 WP_096038768.1,WP_013465871.1,WP_058155244.1
 2 WP_058155244.1 WP_013465871.1,WP_058155244.1,WP_011329269.1
 3 WP_011329269.1 WP_058155244.1,WP_011329269.1,WP_058374608.1
 4 WP_058374608.1 WP_011329269.1,WP_058374608.1,WP_089368983.1
 5 WP_089368983.1 WP_058374608.1,WP_089368983.1,WP_096739105.1
 6 WP_096739105.1 WP_089368983.1,WP_096739105.1,WP_089346667.1
 7 WP_089346667.1 WP_096739105.1,WP_089346667.1,WP_096041177.1
 8 WP_096041177.1 WP_089346667.1,WP_096041177.1,WP_010553306.1
 9 WP_010553306.1 WP_096041177.1,WP_010553306.1,WP_007376542.1
10 WP_007376542.1 WP_010553306.1,WP_007376542.1,WP_039038284.1
...

任何提示都值得赞赏。

我用R做的这个例子:

library(tidyverse)
library(dbplyr)
library(RPostgresql) 
library(DBI)

st2tm %>% 
  mutate(
    p1 = lag(pid),p2 = lead(pid)
  ) %>% 
  group_by(pid) %>% 
  mutate(g = paste(na.omit(c(p1,pid,p2)),sep = ",")) %>% 
  ungroup() %>% 
  select(-c(p1,p2)) %>% 
  filter(str_count(g,",")==2)

但是当通过DBI连接应用于Postgres表时,它会失败并

Error in vapply(x,escape,character(1),con = con) : 
  values must be length 1,but FUN(X[[1]]) result is length 3

pasteError: str_count() is not available in this sql variantfilter

此外,我认为有一些更明智的策略。

预先感谢

解决方法

这很可能是由于dbplyr没有为将na.omitstr_count转换成postgresql而定义的翻译(很可能定义了paste的翻译)。

您可以通过更早检查缺失值来替换str_countna.omit

st2tm %>% 
  mutate(
    p1 = lag(pid),p2 = lead(pid)
  ) %>% 
  filter(!is.na(p1),!is.na(p2)) %>%
  mutate(g = paste(p1,",pid,p2)) %>% 
  select(-c(p1,p2)) %>% 

如果是paste的问题,则可以将其替换为postgresql内置的CONCAT函数。

st2tm %>% 
  mutate(
    p1 = lag(pid),!is.na(p2)) %>%
  mutate(g = CONCAT(p1,p2)) %>% 

由于CONCAT不是R函数,dbplyr会将其传递给Postgresql,而不是尝试对其进行翻译。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。