首页 > 解决方案 > 计算R中不同时间段/间隔的变量平均值

问题描述

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

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 分钟,然后平均这些。

有没有人对更快/更有效的方法有任何建议?谢谢

标签: rfiltertime-series

解决方案


一种方法是使用模运算将日期分组为 120 秒的部分。正如您所说,这仅在数据间隔为 90 + 30 秒时才有效。

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

library(tidyverse)

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

然后,我们可以通过将 secs 除以 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.

推荐阅读