2015-06-18 4 views
1

У меня есть два столбца набора данных с 5 минут частота:R агрегирование определенные строки

Dataset 
      Time  Power 
2015-04-01 04:05:00  1 
2015-04-01 04:10:00  2 
2015-04-01 04:15:00  3 
2015-04-01 04:20:00  4 
2015-04-01 04:25:00  5 
2015-04-01 04:30:00  6 
    ...... 

Как я могу объединить его в 15 минут частоты набора данных? Новый набор данных должен использовать каждую третью метку времени, поскольку новая метка времени, а новая мощность должна быть суммой трех значений мощности.

New dataset 
      Time  Power 
2015-04-01 04:15:00  1+2+3 
2015-04-01 04:30:00  4+5+6 
    ...... 
+0

Привет, ребята, еще один вопрос относительно этой проблемы. Что делать, если временной интервал необработанных данных не фиксирован? Например, временной интервал может составлять 1 мин или 2 мин или 10 мин? Есть ли эффективный способ справиться с этим, чтобы манипулировать данными, чтобы он имел промежуток времени в 15 минут? (обычно метка времени будет в 0, 15, 30 и 45. – user1047

ответ

0
data.frame(Time=dat$Time[seq(3, nrow(dat), by=3)], 
      Power=tapply(dat$Power, floor((seq(nrow(dat))-1)/3), sum)) 
#     Time Power 
# 0 2015-04-01 04:15:00  6 
# 1 2015-04-01 04:30:00 15 
1

Try:

data.frame(T=df$Time[c(F,F,T)], P=rowSums(matrix(df$Power,,3,T))) 
#     T  P 
#1 2015-04-01 04:15:00  6 
#2 2015-04-01 04:30:00 15 

Мы создаем фрейм данных с 15-минутным интервалом по утилизации двух ложных индексов с истинным значением. Наконец, сумма строк берется из столбца Power, помещенного в строки из трех.

Тест

microbenchmark(
plafort = data.frame(T=big.df$Time[c(F,F,T)], P=rowSums(matrix(big.df$Power,,3,T))), 
josilber = data.frame(Time=big.df$Time[seq(3, nrow(big.df), by=3)], 
      Power=tapply(big.df$Power, floor((seq(nrow(big.df))-1)/3), sum)) 
) 
#Unit: milliseconds 
#expr  min   lq  mean median   uq  max neval 
#plafort 1.250796 1.345753 1.451546 1.46044 1.527486 2.045416 100 
#josilber 176.438850 180.862507 187.434138 186.37592 189.628021 340.325792 100 

данных

big.df <- data.frame(Time = rep(df$Time, 1e4), Power = rep(df$Power, 1e4)) 
+0

Спасибо, это работает как волшебство. Гораздо лучше, чем цикл for, который я написал. Кроме того, исходные данные могут не иметь 3n строк, поэтому я добавляю скрипт для удаления дополнительных строк. – user1047

+0

Вы можете удалить дополнительные строки, выполнив это сначала: 'lastrow <- tail (который (1: nrow (df) %% 3 == 0), 1)', чтобы получить последнюю измеряемую строку. Тогда подмножество кадр данных с помощью этого 'df <- df [1: lastrow,]'. Затем запустите тот же скрипт в ответе. –

+0

Привет, plafort. Еще один вопрос относительно этой проблемы. Что, если временной интервал необработанных данных не является фиксированный? Например, временной интервал может составлять 1 мин или 2 мин или 10 мин? Существует ли эффективный способ справиться с этим, чтобы манипулировать данными, чтобы он имел промежуток времени в 15 минут? (обычно метка времени будет равна 0 , 15, 30 и 45. – user1047

1

Создать столбец, идентифицирующий окно для каждого наблюдения (с использованием вектора рециркуляции):

> df$window <- df$Time + minutes(5*c(2,1,0)) 
> print(df) 
       Time power    window 
1 2015-04-01 00:05:00  1 2015-04-01 00:15:00 
2 2015-04-01 00:10:00  2 2015-04-01 00:15:00 
3 2015-04-01 00:15:00  3 2015-04-01 00:15:00 
4 2015-04-01 00:20:00  4 2015-04-01 00:30:00 
5 2015-04-01 00:25:00  5 2015-04-01 00:30:00 
6 2015-04-01 00:30:00  6 2015-04-01 00:30:00 

Тогда группа по окну , и сумма:

> library(dplyr) 
> df %>% group_by(window) %>% summarize(power=sum(power)) -> newdf 
> print(newdf) 
Source: local data frame [2 x 2] 

       window power 
1 2015-04-01 00:15:00  6 
2 2015-04-01 00:30:00 15 
+0

Можете ли вы разместить 'dput' для вашего фрейма данных' df'? Я не получаю вывод, который вы показываете. –

+0

Спасибо за помощь. – user1047

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