2014-12-10 2 views
3

Я пытаюсь использовать dplyr для запроса данных из psql. Мои данные находятся в следующем формате.Вниз выборка данных временных рядов в dplyr из Postgres DB

date     name value 
10-12-2012 10:01:00 var1 100 
10-12-2012 10:55:00 var1 200 
10-12-2012 11:01:00 var1 150 
10-12-2012 11:50:00 var1 100 
10-12-2012 12:11:00 var1 50 
10-12-2012 12:40:00 var1 150 
10-12-2012 10:01:00 var2 10 
10-12-2012 10:33:00 var2 20 
10-12-2012 11:04:00 var2 15 
10-12-2012 11:45:00 var2 25 
10-12-2012 12:02:00 var2 10 
10-12-2012 12:55:00 var2 8 

Хочет агрегировать данные в часовом (или предварительно определенное время выборки) и хочет среднее значения в столбце «значение» в течение этого часа.

Обязательный выход:

date     name value 
10-12-2012 10:00:00 var1 150 
10-12-2012 11:00:00 var1 125 
10-12-2012 12:00:00 var1 100 
10-12-2012 10:00:00 var2 15 
10-12-2012 11:00:00 var2 20 
10-12-2012 12:00:00 var2 9 

Я могу сделать это в Postgres непосредственно с помощью этого запроса:

"SELECT date_trunc('hour', date), name, mean_arr(array_agg(cast(value as double precision))) FROM TABLENAME WHERE name IN ("var1","var2") 

Я хотел бы знать, если мы можем сделать то же самое с помощью dplyr.

я в настоящее время подключения к базе данных с помощью этой команды в dplyr:

my_db <- rc_postgres(dbname="DBNAME",host="HOST",port="PORT",user="USER",password="PASSWD") 
tbl_df <- tbl(my_db, "TABLENAME") 

Необработанные запрос состоит в следующем:

dataOut <- data.frame(tbl_df%>% select(date,name,value) %>% filter(name %in% c('var1','var2') 

Обратите внимание, что я не агрегированных данных в настоящее время, которые я хочу сделать.

Дайте мне знать, если у кого-то есть ответ. Благодаря Прадипом

ответ

4

Это не будет работать непосредственно с вашей таблицей SQL. Но вот что я буду делать:

library(tidyr) 
library(dplyr) 

df <- tbl_df %>% 
    separate(date, into = c("date", "time"), sep = " ") %>% 
    separate(time, into = c("hour", "minute", "seccond"), sep = ":") %>% 
    group_by(date, hour, name) %>% 
    summarise(mean(value)) %>% 
    ungroup() %>% 
    arrange(name) %>% 
    collect() 

#> df 
#Source: local data frame [6 x 4] 
# 
#  date hour name mean(value) 
#1 10-12-2012 10 var1   150 
#2 10-12-2012 11 var1   125 
#3 10-12-2012 12 var1   100 
#4 10-12-2012 10 var2   15 
#5 10-12-2012 11 var2   20 
#6 10-12-2012 12 var2   9 
4

Я хотел бы попробовать что-то вроде этого:

tbl_df %>% 
    filter(name %in% c('var1','var2')) %>% 
    transmutate(date_trunc('hour', date), name, mean_arr(array_agg(as.double(value)))) 

Любые функции, которые dplyr не знаю, как перевести, будут переданы как есть.

+0

Привет, Хэдли, я получаю следующее сообщение об ошибке. Ошибка в eval (expr, envir, enc): не удалось найти функцию «трансмутировать». – Pradeep

+0

Я не мог найти помощь для трансмутации в dplyr – Pradeep

+4

@Pradeep - Я думаю, что Хэдли, возможно, имел в виду «трансмутировать» там. –

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