如何安排 RPostgreSQL 查询并在 R 中创建协方差矩阵
How to arrange RPostgreSQL query and create covariance matrix in R
我想根据尚不适合创建协方差矩阵的数据框创建协方差矩阵。
使用 RPostgreSQL 查询数据库后,我得到了以下类型的数据框:
pg_id item_id value date
1 67808755896 23.5 2016-11-12
2 223337345 0 2016-11-12
3 254337000000 1 2016-11-12
4 34604777037 0 2016-11-12
5 142223438000 14.3 2016-11-12
6 170555690000 22 2016-11-12
整个数据框大约有 500 000 行,大约有 16 000 item_id。
item_id 重复(在这里回顾几个月)。
我最终想做的是为 item_id 的值创建一个协方差矩阵。
为此,作为第一步,我想以一种最终得到如下所示的数据框的方式重新排列数据框:
item_id
date 67808755896 223337345 254337000000 ...
2016-11-12 value value value
2016-11-12 value value value
2016-11-12 value value value
2016-11-12 value value value
2016-11-12 value value value
2016-11-12 value value value
我的问题是,我不知道有什么方法可以按照我需要的方式对数据框进行重新排序。
如果有一个 SQL 查询可以让我在检索时选择获得所需的结构,我想那会是最好的。
在 R 中,我尝试了一些使用 melt 和 spread 的方法,但计算对于我的本地 mac 来说似乎太重了,我上次尝试它只是在某个时候关闭了。
在此先感谢您的帮助!
在 R 中,这应该 运行 相当快:
library(data.table)
set.seed(1)
n_items <- 15996L; n_days <- floor(500000/n_items)
df <- data.frame(
item_id = 1:n_items,
date = rep(seq(Sys.Date(), Sys.Date()+n_days, by=1), each=n_items)
)
df$value <- runif(nrow(df))
dim(df)
# [1] 511872 3
uniqueN(df$item_id)
# [1] 15996
setDT(df)
system.time(wide <- dcast(df, date~item_id, value.var = "value", fun.aggregate = mean))
# User System verstrichen
# 0.19 0.00 0.20
wide[1:5, 1:5]
# date 1 2 3 4
# 1: 2017-01-05 0.26550866 0.3721239 0.57285336 0.9082078
# 2: 2017-01-06 0.09235838 0.3801334 0.03702181 0.5900971
# 3: 2017-01-07 0.24687042 0.9922133 0.53181526 0.5044988
# 4: 2017-01-08 0.29523145 0.2263145 0.33291640 0.1165338
# 5: 2017-01-09 0.83870267 0.3274892 0.95595348 0.3889042
查看 table(您的数据框)
我想根据尚不适合创建协方差矩阵的数据框创建协方差矩阵。
使用 RPostgreSQL 查询数据库后,我得到了以下类型的数据框:
pg_id item_id value date
1 67808755896 23.5 2016-11-12
2 223337345 0 2016-11-12
3 254337000000 1 2016-11-12
4 34604777037 0 2016-11-12
5 142223438000 14.3 2016-11-12
6 170555690000 22 2016-11-12
整个数据框大约有 500 000 行,大约有 16 000 item_id。 item_id 重复(在这里回顾几个月)。
我最终想做的是为 item_id 的值创建一个协方差矩阵。
为此,作为第一步,我想以一种最终得到如下所示的数据框的方式重新排列数据框:
item_id
date 67808755896 223337345 254337000000 ...
2016-11-12 value value value
2016-11-12 value value value
2016-11-12 value value value
2016-11-12 value value value
2016-11-12 value value value
2016-11-12 value value value
我的问题是,我不知道有什么方法可以按照我需要的方式对数据框进行重新排序。
如果有一个 SQL 查询可以让我在检索时选择获得所需的结构,我想那会是最好的。
在 R 中,我尝试了一些使用 melt 和 spread 的方法,但计算对于我的本地 mac 来说似乎太重了,我上次尝试它只是在某个时候关闭了。
在此先感谢您的帮助!
在 R 中,这应该 运行 相当快:
library(data.table)
set.seed(1)
n_items <- 15996L; n_days <- floor(500000/n_items)
df <- data.frame(
item_id = 1:n_items,
date = rep(seq(Sys.Date(), Sys.Date()+n_days, by=1), each=n_items)
)
df$value <- runif(nrow(df))
dim(df)
# [1] 511872 3
uniqueN(df$item_id)
# [1] 15996
setDT(df)
system.time(wide <- dcast(df, date~item_id, value.var = "value", fun.aggregate = mean))
# User System verstrichen
# 0.19 0.00 0.20
wide[1:5, 1:5]
# date 1 2 3 4
# 1: 2017-01-05 0.26550866 0.3721239 0.57285336 0.9082078
# 2: 2017-01-06 0.09235838 0.3801334 0.03702181 0.5900971
# 3: 2017-01-07 0.24687042 0.9922133 0.53181526 0.5044988
# 4: 2017-01-08 0.29523145 0.2263145 0.33291640 0.1165338
# 5: 2017-01-09 0.83870267 0.3274892 0.95595348 0.3889042
查看 table(您的数据框)