2017-01-05 3 views
0

Я хочу создать ковариационную матрицу из фрейма данных, который еще не подходит для его создания.Как организовать запрос RPostgreSQL и создать матрицу ковариации в 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 я попробовал пару вещей от использования расплава, а также для распространения, но вычисления, казалось, были тяжелыми для моего локального mac, который в последний раз, когда я пробовал, просто отключился в какой-то момент.

Заранее благодарим за любую помощь!

ответ

0

В 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 
+0

Благодаря мат! Попробовал это на самом деле, но не думал о fun.aggregate = mean. Хороший, спас мой день! – Elia

+0

'mean' - это просто пример, который суммирует несколько точек данных в одной ячейке сетки, создавая среднее из них. Разумеется, вы также можете использовать 'length' (количество точек данных),' sum' или другие функции ... – lukeA

0

Посмотрите в таблицу (ваш фрейм данных)

Смежные вопросы