【问题标题】:Getting the max for a set of rows in R获取R中一组行的最大值
【发布时间】:2017-01-23 16:37:25
【问题描述】:

所以我有一组时间序列数据,它由 1 分钟的间隔组成,整整一个月。我希望从这些数据中得到一些结果。

  • 利用率最高的一小时。
  • 最低使用一小时。
  • 一天也一样。

在我收到 10 个帖子之前无法添加我的数据样本。

我已经将它复制到另一个数据集,所以我不会更改另一个。

busiestmin <- rdata6
dput(MyData)
busiestmin[ busiestmin$Utilized == max(busiestmin$Utilized) , ] 
# A tibble: 1 × 3
  Entitled Utilized            datetime
  <dbl>    <dbl>              <dttm>
    1     2.73 2016-12-18 02:10:00
busiestmin[ busiestmin$Utilized == min(busiestmin$Utilized) , ]
# A tibble: 22 × 3
   Entitled Utilized            datetime
    <dbl>    <dbl>              <dttm>
      0        0 2016-12-11 03:03:00
      0        0 2016-12-11 03:04:00
      0        0 2016-12-11 03:05:00
      0        0 2016-12-11 03:06:00
      0        0 2016-12-11 03:07:00
      0        0 2016-12-11 03:08:00
      0        0 2016-12-11 03:09:00
      0        0 2016-12-11 03:10:00
      0        0 2016-12-11 03:11:00
      0        0 2016-12-11 03:12:00

# ... 还有 12 行 正如您在上面看到的,我知道如何获取一条线的最小值和最大值,但希望它显示一组 60 行(1 小时)和 1440 行(1 天)。

不确定指向示例数据集的链接是否有效?

dput (MyData) 
 Entitled   Utilized    datetime
  1     1.04        12/3/2016 0:01
  1     1.04        12/3/2016 0:02
  1     1.04        12/3/2016 0:03
  1     1.20        12/3/2016 0:04
  1     1.21        12/3/2016 0:05

【问题讨论】:

  • 请展示一个可重现的小例子和基于该例子的预期输出
  • 它不会让我从 r studio 复制粘贴进去??有什么想法吗?
  • 可以以最适合 SO 的形式添加数据 - 作为文本。请使用dput(MyData) 为您的数据获取文本格式,您可以将其粘贴到您的问题中。如果数据太多,可以试试dput(head(MyData, 20))
  • 好的,谢谢,我会试试
  • 不是你更新的dput输出

标签: r


【解决方案1】:

我认为使用 lubridate 会对您有很大帮助。

这就是我在您的示例数据中读取的方式:

library(readr)
example_data <- read_csv("Entitled, Utilized, datetime\n
                                 1,     1.04, 2016-12-03 00:01:00\n
                                 1,     1.04, 2016-12-03 00:02:00\n
                                 1,     1.04, 2016-12-03 00:03:00\n
                                 1,     1.20, 2016-12-03 00:04:00\n
                                 1,     1.21, 2016-12-03 00:05:00\n
                                 1,     1.05, 2016-12-03 00:06:00\n
                                 1,     1.05, 2016-12-03 00:07:00\n
                                 1,     1.05, 2016-12-03 00:08:00\n
                                 1,     1.43, 2016-12-03 00:09:00\n
                                 1,     1.60, 2016-12-03 00:10:00")

由于您的示例数据都来自同一小时和一天,我们将无法看到小时和一天之间的差异,但这应该适用于您所谈论的内容。我们需要做的第一件事是设置一个新变量来跟踪每个时间戳来自哪一天(或几小时)。您可以使用来自 lubridate 的floor_date

library(lubridate)
library(dplyr)

example_data %>% 
    mutate(FloorDate = floor_date(datetime, unit = "1 day"))
#> # A tibble: 10 × 4
#>    Entitled Utilized            datetime  FloorDate
#>       <int>    <dbl>              <dttm>     <dttm>
#> 1         1     1.04 2016-12-03 00:01:00 2016-12-03
#> 2         1     1.04 2016-12-03 00:02:00 2016-12-03
#> 3         1     1.04 2016-12-03 00:03:00 2016-12-03
#> 4         1     1.20 2016-12-03 00:04:00 2016-12-03
#> 5         1     1.21 2016-12-03 00:05:00 2016-12-03
#> 6         1     1.05 2016-12-03 00:06:00 2016-12-03
#> 7         1     1.05 2016-12-03 00:07:00 2016-12-03
#> 8         1     1.05 2016-12-03 00:08:00 2016-12-03
#> 9         1     1.43 2016-12-03 00:09:00 2016-12-03
#> 10        1     1.60 2016-12-03 00:10:00 2016-12-03

如果您的数据超过一天或一小时,您将在我们刚刚创建的新列中看到这些数据。如果您想找到每小时的最大值/最小值,可以使用unit = "1 hour"。现在我们可以使用group_bysummarize 来查找每天的最大值和最小值。

example_data %>% 
    mutate(FloorDate = floor_date(datetime, unit = "1 day")) %>%
    group_by(FloorDate) %>%
    summarise(MaxUtilized = max(Utilized),
              MinUtilized = min(Utilized))
#> # A tibble: 1 × 3
#>    FloorDate MaxUtilized MinUtilized
#>       <dttm>       <dbl>       <dbl>
#> 1 2016-12-03         1.6        1.04

如果您的真实数据包含多天,您的结果将在此处包含每一天的行,每个行都有最大值和最小值。

【讨论】:

    猜你喜欢
    • 2021-03-01
    • 2020-05-15
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多