Извлекать максимальную почасовую стоимость каждый день R - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть эти data.frame:

                 Time    a    b    c     d
1 2015-01-01 00:00:00  863 1051 1899 25385
2 2015-01-01 01:00:00  920 1009 1658 24382
3 2015-01-01 02:00:00 1164  973 1371 22734
4 2015-01-01 03:00:00 1503  949  779 21286
5 2015-01-01 04:00:00 1826  953  720 20264
6 2015-01-01 05:00:00 2109  952  743 19905
...
                    Time   a   b    c     d
8756 2015-12-31 19:00:00   0 775 4957 28812
8757 2015-12-31 20:00:00   0 783 5615 29568
8758 2015-12-31 21:00:00   0 790 4838 28653
8759 2015-12-31 22:00:00   0 766 3841 27078
8760 2015-12-31 23:00:00  72 729 2179 24565
8761 2016-01-01 00:00:00 290 710 1612 23311

Он представляет каждый час каждого дня в году.Я хотел бы извлечь одну строку в день, как функцию максимального значения d.Поэтому в конце я хочу получить data.frame размером 365x5.

Я перепробовал все предложения из: Извлечь максимальное значение в каждой группе в кадре данных , а также: Ежедневные минимальные значения в R , но они все еще не работают.

Может быть, это может быть связано с тем, как я продолжаю генерировать мою серию времени?

library(lubridate)
start <- dmy_hms("1 Jan 2015 00:00:00")
end <- dmy_hms("01 Jan 2016 00:00:00")
time <- as.data.frame(seq(start, end, by="hours"))

Спасибо запомощь!

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

«Макс» не работает с факторами.Следовательно, преобразуйте столбец (в вашем случае, его столбец d ), для которого вы находите максимум, в двойной, используя as.numeric Предполагая, что ваш набор данных находится во фрейме данных

mydf$d = as.numeric(mydf$d)
0 голосов
/ 19 декабря 2018

Спасибо за вашу помощь!Наконец, я выбираю

do.call(rbind, lapply(split(test,test$time), function(x) {return(x[which.max(x$d),])}))

, что позволяет мне иметь размер кадра данных 365x5.Все ваши предложения были правильными.Мне просто нужно было изменить мою серию времени, например

time <- as.data.frame(rep(c(1:365), each = 24))
test<- cbind.data.frame(time, df, timebis)

, что позволило бы мне иметь размер кадра данных 365x5.Все ваши предложения были правильными.Мне просто нужно было изменить серию времени.

0 голосов
/ 18 декабря 2018

Если мы агрегируем по «Дню», преобразуем столбец «Время» в класс Date, удаляя атрибуты Time, сгруппированные по ним, и получим max из 'd'.В посте ОП синтаксис для data.table включает mydf и df.Предполагая, что они одинаковы, нам нужно

library(data.table)
setDT(mydf)[, .(d = max(d)), by = .(Day = as.Date(Time))]

Или использовать aggregate из base R

aggregate(d ~ Day, transform(mydf, Day = as.Date(Time)), FUN = max)

Или с tidyverse

library(tidyverse)
mydf %>%
   group_by(Day = as.Date(Time)) %>%
   summarise(d = max(d))

ПРИМЕЧАНИЕ. Исходя из комментариев ОП, столбцы с «a» по «d» относятся к классу factor.Нам нужно преобразовать его в numeric либо в начале, либо преобразовать его на этапе обработки

mydf$d <- as.numeric(as.character(mydf$d)))

Для нескольких столбцов

mydf[c('a', 'b', 'c', 'd')] <- lapply(mydf[c('a', 'b', 'c', 'd'), function(x)
       as.numeric(as.character(x)))

data

mydf <- structure(list(Time = c("2015-01-01 00:00:00", "2015-01-01      01:00:00", 
 "2015-01-01 02:00:00", "2015-01-01 03:00:00", "2015-01-01 04:00:00", 
 "2015-01-01 05:00:00"), a = c(863L, 920L, 1164L, 1503L, 1826L, 
 2109L), b = c(1051L, 1009L, 973L, 949L, 953L, 952L), c = c(1899L, 
 1658L, 1371L, 779L, 720L, 743L), d = c(25385L, 24382L, 22734L, 
 21286L, 20264L, 19905L)), class = "data.frame", row.names = c("1", 
  "2", "3", "4", "5", "6"))
...