2015-05-06 2 views
0

Я новичок в R, и я хочу сделать несколько графиков об использовании электричества. У меня есть несколько больших файлов, содержащих временную метку и (кумулятивное) измерение. Я хотел бы иметь три типа графиков:R получить разницу за единицу времени

  • Использование в час в день
  • Использование в день недели
  • Использование в месяц в течение года

Чтобы сделать, например, использование в час дня, мне нужно:

  • Получить использование каждого часа каждого дня
  • Av тить каждый час каждого дня

Данные у меня есть выглядит следующим образом:

2014-10-22 21:07:03+00:00,7432442.0 
2014-10-22 21:07:21+00:00,7432443.0 
2014-10-22 21:07:39+00:00,7432444.0 
2014-10-22 21:07:57+00:00,7432445.0 
2014-10-22 21:08:15+00:00,7432446.0 
2014-10-22 21:08:33+00:00,7432447.0 
2014-10-22 21:08:52+00:00,7432448.0 
2014-10-22 21:09:10+00:00,7432449.0 
2014-10-22 21:09:28+00:00,7432450.0 

Я могу загрузить в данных и анализировать метку времени с as.POSIXct(). Я также знаю, что diff() - это разница. Но как применить это ко всей таблице данных?

Кроме того, что происходит с данными в промежутках времени? Например:

2014-10-22 23:59:54+00:00,7433033.0 
2014-10-23 00:00:12+00:00,7433034.0 

1 единица чего-то использовалась между 22-м и 23-м. Должно ли это просто быть отброшено или добавлено к тому или другому?

+0

Я предлагаю вам посмотреть на '? Cut.POSIXt' и'? Seq.POSIXt' для способов группировки ваших данных в периоды времени. – MrFlick

+0

если проблема diff: данные (mtcars) mtcars $ diff = c (0, diff (mtcars $ mpg)) – Henk

+0

Извините; какой второй столбец? Когда вы говорите, что хотите использовать график, это то, что представлено во втором столбце? – TARehman

ответ

2

Используя фиктивный набор данных

# sorted dataset 
n = 1000 
set.seed(1) 
data = data.frame(
    time=seq(as.POSIXct('2014-10-22 21:07:00'), 
      as.POSIXct('2014-10-23 10:07:00'), 
      length.out=n), 
    value=cumsum(runif(n))/n) 

мы могли бы рассчитать изменение стоимости на час дня, используя

# by hour of a day 
starttime = as.POSIXct(format(min(data$time),'%Y-%m-%d')) 
endtime = as.POSIXct(format(max(data$time),'%Y-%m-%d'))+60*60*24 
hod = with(data, 
      c(by(value, 
       cut(time,seq(starttime,endtime,'hour')), 
       function(x)x[length(x)]-x[1]))) 

, а затем построить результаты, делая

# plot 
plot(as.POSIXct(names(hod)), hod, type='l') 
barplot(hod) 

plot(as.POSIXct(names(hod)), hod, type='l') barplot(hod)

Edit:

Агрегирование через дни может быть сделано с

# average across days of the total usage within each hour 
hod_m = c(by(hod, 
      format(as.POSIXct(names(hod)),'%H'), 
      mean,na.rm=T)) 

Вместо того расчета общего использования в течение каждого дня - час, вы можете вычислить «среднюю» использование каждого наблюдения в течение каждого дня - через

# average usage per observation within each hour of each day 
au = with(data, 
      c(by(value, 
       cut(time,seq(starttime,endtime,'hour')), 
       function(x)(x[length(x)]-x[1])/(length(x)-1)))) 

и последние меры среднего использования за наблюдение могут быть агрегированы в течение нескольких дней по часам г

# average across days of the above average usage within each day--hour 
au_m = c(by(au, 
      format(as.POSIXct(names(hod)),'%H'), 
      mean,na.rm=T)) 

Аналогично, агрегации, чем другие mean функции могут быть использованы в указанных выше.

+0

Очень приятно! Как насчет получения среднего числа всех часов в течение всех дней, чтобы все значения с 1:00 до 1:59 каждого дня составляли в среднем? – jdepypere

+0

Вы можете попробовать 'c (by (hod, format (as.POSIXct (имена (hod)), '% H'), mean, na.rm = T))' – js86

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