计算R中不同时间段/间隔的变量平均值

时间:2020-04-14 05:52:49

标签: r filter time-series

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

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

有人对更快或更有效的方式有任何建议吗? 谢谢

2 个答案:

答案 0 :(得分:0)

一种方法是使用模块化算法将日期分组为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.

答案 1 :(得分:0)

请考虑按照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()