【问题标题】:Calculating average of a variable for different time segments/intervals in R计算R中不同时间段/间隔的变量平均值
【发布时间】:2020-04-14 05:52:49
【问题描述】:

我有一组训练数据,每秒钟记录一次数据。

Rows: 897
Columns: 8
$ session.date <dttm> 2020-04-09 07:12:00, 2020-04-09 07:12:00, 2020-04-09 07:12:00, 2020-04-09 07:12:00, 2020-04-09 07:12:00, 2020-04-09 07:12:00, 2020-04-09 07:12:00, 2020-04-09 07:12:00, 2020-04-09 07:12:00, 2020...
$ secs         <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, ...
$ power        <dbl> 187.000, 187.000, 187.000, 187.000, 194.250, 201.500, 208.750, 216.000, 225.000, 234.000, 243.000, 246.000, 249.000, 252.000, 255.000, 252.000, 249.000, 246.000, 245.250, 244.500, 243.750, 243.0...
$ distance     <dbl> 0.0000, 5.0000, 10.0000, 13.9900, 17.9925, 21.9950, 25.9975, 30.0000, 35.6633, 41.3267, 46.9900, 50.9925, 54.9950, 58.9975, 63.0000, 68.3333, 73.6667, 79.0000, 83.2500, 87.5000, 91.7500, 96.0000...
$ cadence      <dbl> 0.0000, 0.0000, 0.0000, 0.0000, 4.2500, 8.5000, 12.7500, 17.0000, 16.6667, 16.3333, 16.0000, 16.2500, 16.5000, 16.7500, 17.0000, 16.6667, 16.3333, 16.0000, 16.0000, 16.0000, 16.0000, 16.0000, 16...
$ heart_rate   <dbl> 0.000, 50.000, 100.000, 102.000, 104.000, 106.000, 108.000, 110.000, 112.333, 114.667, 117.000, 118.500, 120.000, 121.500, 123.000, 125.333, 127.667, 130.000, 130.750, 131.500, 132.250, 133.000,...
$ speed        <dbl> 4.055000, 4.055000, 4.055000, 4.055000, 4.105750, 4.156500, 4.207250, 4.258000, 4.313333, 4.368667, 4.424000, 4.442000, 4.460000, 4.478000, 4.496000, 4.480000, 4.464000, 4.448000, 4.442000, 4.43...
$ min          <dbl> 0.00, 0.02, 0.03, 0.05, 0.07, 0.08, 0.10, 0.12, 0.13, 0.15, 0.17, 0.18, 0.20, 0.22, 0.23, 0.25, 0.27, 0.28, 0.30, 0.32, 0.33, 0.35, 0.37, 0.38, 0.40, 0.42, 0.43, 0.45, 0.47, 0.48, 0.50, 0.52, 0....

此数据来自一个间隔设置,其中有 4 x 90 秒的“工作”和 30 秒的休息。我想平均每 90 秒工作期间的功率,然后获得会话“工作”部分的总体平均值。我可以在我想要的时间段内单独执行此操作。

library(dplyr)
df <- Data %>%
filter(min>=0 & min <= 1.5) %>%
group_by(session.date) %>%
summarise(ave_power = mean(power))

但是,对于我想要获取平均值的所有不同时间点,这似乎很乏味。即 0-1.5 分钟、2-3.5 分钟、4-5.5 分钟、6-7.5 分钟,然后取平均值。

有人对更快/更有效的方法有什么建议吗? 谢谢你

【问题讨论】:

    标签: r filter time-series


    【解决方案1】:

    一种方法是使用模运算将日期分成 120 秒的部分。如您所说,这仅适用于数据间隔为 90 + 30 秒的情况。

    首先生成一些示例数据。我们可以使用4 * 120 = 480 秒的数据和一些随机生成的功率读数。

    library(tidyverse)
    
    df <- tibble(secs = 0:479, power = runif(480, 180, 250))
    

    然后我们可以通过将秒除以 120 的整数将数据分组为 120 秒长的块。按组的秒数也可以计算为 mod(secs, 120)。

    df <- df %>% 
      mutate(
        group = secs %/% 120 + 1,
        secs_group = secs %% 120
      ) %>% 
      mutate(period = if_else(secs_group < 90, "work", "rest")) 
    
    # # A tibble: 480 x 5
    #     secs power group secs_group period
    #    <int> <dbl> <dbl>      <dbl> <chr> 
    #  1     0  230.     1          0 work  
    #  2     1  246.     1          1 work  
    #  3     2  248.     1          2 work  
    #  4     3  232.     1          3 work  
    #  5     4  223.     1          4 work  
    #  6     5  243.     1          5 work  
    #  7     6  243.     1          6 work  
    #  8     7  194.     1          7 work  
    #  9     8  192.     1          8 work  
    # 10     9  247.     1          9 work  
    # # ... with 470 more rows
    
    

    我还将每条记录标识为“工作”或“休息”,具体取决于它是否在组的前 90 秒内。

    然后可以计算每个组的平均功率

    df %>% 
      filter(period == "work") %>% 
      group_by(group) %>% 
      summarise(mean_power = mean(power))
    
    # # A tibble: 4 x 2
    #   group mean_power
    # * <dbl>      <dbl>
    # 1     1       216.
    # 2     2       216.
    # 3     3       217.
    # 4     4       214.
    

    【讨论】:

      【解决方案2】:

      请考虑按照How to make a great R reproducible example 制作可重现的示例(包括数据)

      要获得每 90 秒时间段的平均值,您可以创建一个具有不同时间间隔的新变量,然后按以下分组:

      library(dplyr)
      Data %>%
        mutate(Cuts = cut(min, seq(from = 0, to = 60, by = 1.5))) %>%
        group_by(session.data, Cuts) %>%
        summarise(ave_power = mean(power)) %>%
        ungroup()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-20
        • 2021-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-13
        相关资源
        最近更新 更多