假设我有一个非常大的SQL数据库,并且我想为浮点数列中的值创建一个密度图。我可以很容易地导入R中的所有值并绘制密度。但是,由于表有那么多行,所以我希望避免导入所有值,而是使用查询在SQL server上计算汇总统计信息(例如min、q25、中位数、q75、max),并且只导入这几个摘要值,从而减少通信量。
因此,在R中,我将获得类似于agg对象的数据:
require(data.table)
# test data
set.seed(1234)
vec = rgamma(1000, shape = 0.75)
dt = data.table(group = 'A',
val = vec)
agg = dt[ ,
.(min = min(val),
q25 = quantile(val, .25),
med = median(val),
q75 = quantile(val, .75),
max = max(val)) ]如何使用{ggplot2}包从这些聚集的数据构建密度或小提琴图?我假设geom_density()无论如何都会在幕后计算这样的值,但我不能直接将它们输入函数。
我只想通过使用agg对象来检索这样一个图:
require(ggplot2)
ggplot(dt) +
geom_density(aes(x = val))旁注:另一种方法是只导入一个值的样本。
发布于 2020-09-27 20:46:42
您可以在数据库端用足够小的回收箱对数据进行分组和计数,导出(小得多的)聚合数据,然后重建密度图。这里的“足够小”意味着数据的实际分布与聚合数据的估计分布之间的差异很小,不足以影响您的目标。
你可能需要做一些实验,因为它取决于密度变化的尺度。在下面的示例中,我使用了10,000个回收箱,这仍然是一个相对较小的数据集,可以从数据库导出。注意,我已经将您的vec示例数据扩展到了100万个值:
require(tidyverse)
require(patchwork) # Needed only for laying out the two plots
require(data.table)
# test data
set.seed(1234)
vec = rgamma(1e6, shape = 0.75)
dt = data.table(group = 'A',
val = vec)
agg = dt[ ,
.(min = min(val),
q25 = quantile(val, .25),
med = median(val),
q75 = quantile(val, .75),
max = max(val)) ]
# Set breaks for aggregrating
br = seq(min(vec), max(vec), length.out=10000)
dx = median(diff(br))
# Aggregate data
agg2 = dt %>%
count(val = cut(val, breaks=br, labels=(br + dx)[-length(br)],
include.lowest=TRUE),
val = as.numeric(as.character(val)))
p = ggplot(data=dt, aes(val)) +
geom_density(size=1, colour="blue", n=2^11) +
geom_density(data=agg2 %>% uncount(weight=n), colour="orange", n=2^11) +
theme_bw()
p + {p + coord_cartesian(xlim=c(0,0.3))}左手图将实际数据的密度图与从数据聚合到10,000个桶中重建的密度进行比较。右图在x轴上放大到接近于零的薄峰区域.注意极佳的重叠。

https://stackoverflow.com/questions/64092614
复制相似问题