postgres 使用 slide window 生成数组
postgres generate array using slide window
我正在尝试弄清楚如何通过查询生成 ARRAY,给定滑动 window 在字符列上使用 Postgre。
例如,如果我有这个:
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
...
我想要在行前后滑动 window 大小 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 table 时,它会失败
Error in vapply(x, escape, character(1), con = con) :
values must be length 1,
but FUN(X[[1]]) result is length 3
在 paste
和 Error: str_count() is not available in this SQL variant
在 filter
。
此外,我认为一些更聪明的策略。
这很可能是因为 dbplyr 没有为将 na.omit
或 str_count
转换为 postgresql 定义翻译(很可能定义了 paste
的翻译)。
您可以通过提前检查缺失值来替换 str_count
和 na.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),
p2 = lead(pid)
) %>%
filter(!is.na(p1),
!is.na(p2)) %>%
mutate(g = CONCAT(p1, ",", pid, ",", p2)) %>%
select(-c(p1, p2)) %>%
因为 CONCAT
不是 R 函数,dbplyr 会将其按写入 postgresql 的形式传递,而不是尝试翻译它。
我正在尝试弄清楚如何通过查询生成 ARRAY,给定滑动 window 在字符列上使用 Postgre。
例如,如果我有这个:
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
...
我想要在行前后滑动 window 大小 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 table 时,它会失败
Error in vapply(x, escape, character(1), con = con) :
values must be length 1,
but FUN(X[[1]]) result is length 3
在 paste
和 Error: str_count() is not available in this SQL variant
在 filter
。
此外,我认为一些更聪明的策略。
这很可能是因为 dbplyr 没有为将 na.omit
或 str_count
转换为 postgresql 定义翻译(很可能定义了 paste
的翻译)。
您可以通过提前检查缺失值来替换 str_count
和 na.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),
p2 = lead(pid)
) %>%
filter(!is.na(p1),
!is.na(p2)) %>%
mutate(g = CONCAT(p1, ",", pid, ",", p2)) %>%
select(-c(p1, p2)) %>%
因为 CONCAT
不是 R 函数,dbplyr 会将其按写入 postgresql 的形式传递,而不是尝试翻译它。