【问题标题】:Simple Visualization for data from PostgreSqL in RR 中 PostgreSqL 数据的简单可视化
【发布时间】:2020-11-11 22:37:28
【问题描述】:

在 R 中使用外部数据库时,我是初学者。

几个月前我已经问过如何将一个巨大的数据集导入 PostgreSqL 并得到了完美的答案。 所以我想我在这里再试一次。

有没有一种简单的方法可以在 R 中为外部数据绘制一些绘图、图表或箱线图?

这是我的代码:

  1. 首先我连接到数据库,进行连接并获取一些平均值,这很慢,但工作正常
  2. 问题在于最后一段代码,我想在其中绘制 xlab 上的年份和 ylab 上的价格。
db_tankdata <- 'tankdaten'  
host_db <- 'localhost'
db_port <- '5432'
db_user <- 'postgres'  
db_password <- 'xxx'
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname = db_tankdata, host=host_db, 
                 port=db_port, user=db_user, password=db_password)

#do a join with tables from database, filter a city

ms_stations_comb <- tbl(con, "prices") %>% left_join(tbl(con, "stations"), by = c("station_uuid" ="uuid")) %>% filter(str_detect(post_code, "^481"))

#get mean prices for different types of fuel

ms_stations_comb %>% summarize(mean_diesel = mean(diesel), mean_e5 = mean(e5), mean_e10 = mean(e10))

#do a plot with years on xlab and price on ylab

ms_stations_comb %>%  dbplot_line(year(date), e5)


代码确实给了我一个错误提示:

错误:列“dbplyr_016.e5”必须在 GROUP-BY 子句中或出现在聚合函数中 第 1 行:选择“年(日期)”、“e5”

编辑:基本上我想在 xlab 上做一个多年的情节,在 y lab 上做一个价格。该数据集包含例如燃料价格 (e5) 和格式为“2018-04-13 23:17:06”的日期。

提前致谢!

【问题讨论】:

  • summarize 应在使用group_by 设置分组变量后使用。如果您在帖子中包含一些数据和期望的结果,人们可以提供更具体的建议。
  • 顺便说一句:SQL 中没有 year() 函数。 (它是 Sybase/Microsoft 扩展)

标签: r postgresql dbplyr


【解决方案1】:

通常,在 R 中绘制数据需要数据位于 R 的本地内存中。如果有太多数据要加载到 R 的本地内存中,那么您可能不应该绘制它(我曾经尝试绘制 100M 个数据点,但结果很糟糕)。

我建议在数据库中准备数据,然后仅将绘图所需的数据加载到 R 的本地内存中。

remote_summary = remote_table %>%
  mutate(the_year = YEAR(date)) %>%
  group_by(the_year) %>%
  summarise(e5 = mean(e5))

local_table = collect(remote_summary)

# ggplot or you preferred plotting commands here using local_table

在上面的代码中,我们首先创建一个新变量作为年份,然后生成每年的平均 e5 值。这会生成您要在数据库中绘制的摘要。

然后可以使用collect将远程摘要加载到R的本地内存中,然后可以绘制本地表中的数据。

正如@wildplasser 指出的那样,postgresql 中没有year() 函数。你可能想要DATE_PART。因此,您的代码如下所示:

remote_summary = remote_table %>%
  mutate(the_year = DATE_PART(YEAR, date)) %>%
  ...

因为DATE_PART 不是 R 函数,没有为它定义 dbplyr 翻译,所以它应该按原样直接传递给 postgresql - 生成有效的 postgresql 查询。您可以使用show_query 检查底层查询是否正确。我推荐:

show_query(remote_summary)

在收集远程摘要之前。如果显示查询显示有效的 sql 查询,则收集应该可以工作。否则,您将需要调整 remote_summary 的定义以获得有效的 sql 查询。

【讨论】:

  • 而且数据太大了就没办法画图了?为了找出数据集中的异常值,我真的需要制作一些箱线图
  • dbplyr 让 R 将类似 dplyr 的操作推送到 sql 中。制作绘图不是 sql 的设计目的,因此您不能将生成从 R 推送到 sql。
  • 但是,您无需将所有数据加载到 R 中即可生成箱线图。您可以在 sql 中计算中位数、上四分位数、下四分位数、最小值和最大值。然后可以将这些值加载到 R 中并绘制出来。这将是从 R 传输到 sql 的少量信息。这个问题可能会帮助您做到这一点:stackoverflow.com/questions/14316562/…
猜你喜欢
  • 2019-09-15
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 2021-09-19
  • 2023-04-03
相关资源
最近更新 更多