Subconfigurando um quadro de dados em R com base nas datas [fechado]

8

Eu tenho um conjunto de dados com uma estrutura semelhante a um arquivo de log muito simples, quero agrupar os dados de acordo com os intervalos de datas, mas só posso fazer isso em um parâmetro.

meus dados ficam assim:

            date_time loc_id node  energy   kgco2 
1 2009-02-27 00:11:08     87  103 0.00000 0.00000 
2 2009-02-27 01:05:05     87  103 7.00000 3.75900 
3 2009-02-27 02:05:05     87  103 6.40039 3.43701 
4 2009-02-27 03:05:05     87  103 4.79883 2.57697 
5 2009-02-27 04:05:05     87  103 4.10156 2.20254 
6 2009-02-27 05:05:05     87  103 2.59961 1.39599

o arquivo inclui dados de um ano inteiro, quero criar gráficos de resumo para cada mês e talvez semana

Estou processando o date_time da seguinte maneira:

> dt <-as.POSIXlt(ae$date_time)
> ae$dt <- dt
> names(ae$dt)
[1] "sec"   "min"   "hour"  "mday"  "mon"   "year"  "wday"  "yday"  "isdst"

agora estou tentando agrupar os dados como:

> x <- ae$energy[ae$dt$year=="110" & ae$dt$mon=="10"]
> x
numeric(0)

"110" é porque o seguinte:

> range(ae$dt$year)
[1] 109 110

Eu também tentei o seguinte sem sorte:

> d <- subset(ae, (dt$year=="110" & dt$mon=="10"), select=energy)

estes, no entanto, funcionam:

> d <- subset(ae, dt$year=="110", select=energy)

e isso também

> d <- subset(ae, dt$mon=="10", select=energy)

Alguma idéia de como posso definir um subconjunto selecionando ano e mês?

Obrigado,

G Garcia
fonte
2
Seu código não funciona porque os componentes de um objeto POSIXlt são numéricos / inteiros, não caracteres. Mas, como disse Shane, você realmente deve estar usando uma classe de séries temporais ...
Joshua Ulrich
Sim, se você notar, eu já publiquei a solução abaixo há alguns dias.
G # # # G Garcia Garcia

Respostas:

6

ok, as séries temporais parecem ter feito o truque:

aets <- as.xts(read.zoo("n8_energy_actual2009_2010.csv", header=TRUE, sep=",", FUN=as.POSIXct))
eats.2010 <- aets["2010-01::2010-10"]
G Garcia
fonte
4

Alguns pontos:

  1. Não sei por que isso está acontecendo. Claramente, os slots POSIXlt estão incorretos. Normalmente, uso o POSIXct, a menos que seja absolutamente necessário ajustar os slots.
  2. Uma opção é usar as datas diretamente, em vez de mexer nos slots, e dizer <=e >=subconjunto. Algo comoae[ae$date >= as.POSIXlt("2009-10-01") & ae$date < as.POSIXlt("2009-11-01"),]
  3. Você deve considerar o uso de uma série temporal para isso, pois esse é o objetivo exato dessa estrutura de dados (e eles fornecem muitas funções úteis para lidar com dados ao longo do tempo). Um dos mais comuns é zoo. xtstambém inclui várias funções que podem ajudar com esse tipo de coisa.
Shane
fonte
Obrigado Shane, eu não tive nenhuma experiência em analisar séries temporais. Tentei brevemente dxts = as.xts (as.POSIXct (ae $ date_time)), mas não tive sorte em apontar?
G Garcia
+1 para recomendar zoo. Isso tornaria sua tarefa muito mais fácil. xtsé mais para implementadores de pacotes, embora eu tenha usado diretamente.
Wayne