【问题标题】:Extract maximum hourly value each day R每天提取最大小时值 R
【发布时间】:2019-05-18 10:03:30
【问题描述】:

我有这个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 dataframe 和:Daily 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"))

感谢您的帮助!

【问题讨论】:

  • 这些mydfdf 是不同的对象吗?如果是data.table,使用setDT(mydf)[, .(d = max(d)), by = .(Day = as.Date(Time))]

标签: r time-series extract


【解决方案1】:

如果我们按“日”进行聚合,则将“时间”列转换为 Date 类,去掉按这些属性分组的 Time 属性,得到“d”的 max。在 OP 的帖子中,data.table 的语法涉及mydfdf。假设这些是相同的,我们需要

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

或者使用来自base Raggregate

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 的 cmets,列 '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"))

【讨论】:

  • 两者都返回Error in Summary.factor(c(2144L, 1669L, 947L, 392L, 164L, 95L, 111L, 185L, : ‘max’ not meaningful for factors
  • @Sebastien_H 返回什么?
  • @Sebastien_H 您问题中的描述是one that contains the maximum value of d of the day.
  • @Sebastien_H 我假设您的“a”到“d”列是numeric。创建data.frame时一定有一些问题。您可以在进行聚合之前做一件事。 IE。 mydf[-1] &lt;- lapply(mydf[-1], function(x) as.numeric(as.character(x)))
  • Error in summarise_impl(.data, dots) : Evaluation error: ‘max’ not meaningful for factors.
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    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。你所有的主张都是正确的。我只需要改变我的时间序列。

    【讨论】:

      猜你喜欢
      • 2018-09-17
      • 2014-10-17
      • 2016-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多