【问题标题】:How to arrange RPostgreSQL query and create covariance matrix in R如何在 R 中安排 RPostgreSQL 查询并创建协方差矩阵
【发布时间】:2017-05-19 22:10:03
【问题描述】:

我想从一个尚不适合创建协方差矩阵的数据框创建一个协方差矩阵。

使用 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 来说,计算似乎过于繁重,我上次尝试时它只是在某个时候关闭。

提前感谢您的帮助!

【问题讨论】:

    标签: sql r dataframe time-series rpostgresql


    【解决方案1】:

    在 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
    

    【讨论】:

    • 谢谢伙计!实际上已经尝试过,但没有考虑 fun.aggregate=mean 。好一个,拯救了我的一天!
    • mean 只是一个例子,它通过构建它们的平均值来汇总一个网格单元中的多个数据点。当然也可以使用length(数据点数)、sum或者其他函数...
    【解决方案2】:

    查看表格(您的数据框)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-06
      相关资源
      最近更新 更多