每天提取最大小时值R

时间:2018-12-18 01:56:36

标签: r time-series extract

我有这个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最大值的函数。因此,最后我想获得365x5的data.frame。

我已经尝试了:Extract the maximum value within each group in a dataframeDaily minimum values in 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 :(得分:3)

如果我们按照“天”进行汇总,则将“时间”列转换为Date类,剥离Time属性(按这些属性分组),得到'd的max '。在OP的帖子中,data.table的语法涉及mydfdf。假设这些相同,我们需要

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))

注意:根据OP的注释,列'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)))

数据

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"))

答案 1 :(得分:0)

'max'不适用于因子。因此,使用 as.numeric 将您要查找最大值的列(在您的情况下为 d 列)转换为两倍。 假设您的数据集在数据框中

mydf$d = as.numeric(mydf$d)

答案 2 :(得分:0)

感谢您的帮助!最后我选择

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

这使我拥有365x5的data.frame。您的所有主张都是正确的。我只需要像

那样更改时间序列即可
time <- as.data.frame(rep(c(1:365), each = 24))
test<- cbind.data.frame(time, df, timebis)

这使我拥有365x5的data.frame。您的所有主张都是正确的。我只需要更改时间序列即可。