我正在尝试使用dplyr
和dbplyr
与Postgres表进行交互,而不将数据收集(拉)到R.
如果表的格式如下x所示,我如何计算定义的分组中不同值的计数?
例如,这个例子是模仿我想做的事情:
# Would actually be x = tbl(src = "postgres_conn", "x")
x = data.frame(
a = c(1, 1, 2, 2, 3, 3),
b = c(1, 1, 1, 2, 2, 2),
c = c(1, 2, 3, 1, 2, 3)
)
> x
a b c
1 1 1 1
2 1 1 2
3 2 1 3
4 2 2 1
5 3 2 2
6 3 2 3
x %>% group_by(a, b) %>% mutate(Count = n_distinct(c))
# Results
# A tibble: 6 x 4
# Groups: a, b [4]
a b c Count
<dbl> <dbl> <dbl> <int>
1 1 1 1 2
2 1 1 2 2
3 2 1 3 1
4 2 2 1 1
5 3 2 2 2
6 3 2 3 2
如果我在Postgres tbl上使用n_distinct(c),我会收到以下错误:窗口函数没有实现DISTINCT。
我尝试了length(unique(c)),它返回了语法错误。
尝试
sql('COUNT(DISTINCT(c))')
给了我这个错误:
column "c" does not exist. HINT: Perhaps you meant to reference the column "aresphukou.c."
但是,aresphukou是一个任意临时表名,每次运行查询时都会更改。
最后,我尝试了replyr_uniqueValues
,但似乎忽略了分组,并为所有Count值返回值1.
有人可以建议如何解决这个问题吗?
答案 0 :(得分:0)
我在将近四年后偶然遇到了这个问题。使用 dbplyr/dplyr,您可能无法获得所需的响应,但使用 PostgreSQL,您可以通过将子查询或 CTE(公共表表达式)的结果与 x 表连接来实现:
with y as (
select a, b, count(c) as n
from x
group by a,b
)
select a, b, c, n
from x
left join y using (a,b);