计算 20 秒间隔内的平均值并按另一列分组

Posted

技术标签:

【中文标题】计算 20 秒间隔内的平均值并按另一列分组【英文标题】:Compute average over 20 second intervals and group by another column 【发布时间】:2021-11-19 04:49:07 【问题描述】:

我正在处理在象海豹潜水期间收集的不同变量的大型数据集。我想以精细的规模(20 秒的间隔)分析我的数据。我想将我的数据分成 20 秒的间隔,基本上我只想得到每 20 秒的平均值,这样我就可以对这些数据间隔进行更多分析。但是,我需要按潜水 # 对数据进行分组,这样我就不会将来自不同潜水的信息分箱。

目前我尝试了三种方法:

period.apply() 但我无法使用此功能进行分组。 split() 通过潜水 # 对我的数据进行子集化,但似乎无法找到一种方法来计算平均值 这些子集中以 20 秒为间隔的不同列。 openair 包,使用timeaverage() 但继续报错(见下面的代码)。

下面是数据的样子,以及我尝试过的代码。我想要每 20 秒窗口的深度、MSA、rate_s 和 HR 的平均值 - 按 DiveNum 分组,~理想情况下~ 还有 D_phase。

> head(seal_dives)
             datetime   seal_ID  Depth    MSA        D_phase diveNum rate_s     HR
1 2018-04-06 14:47:51  Congaree  4.5    0.20154042       D       1     NA     115.3846
2 2018-04-06 14:47:51  Congaree  4.5    0.20154042       D       1     NA     117.6471
3 2018-04-06 14:47:52  Congaree  4.5    0.11496760       D       1     NA     115.3846
4 2018-04-06 14:47:52  Congaree  4.5    0.11496760       D       1     NA     122.4490
5 2018-04-06 14:47:53  Congaree  4.5    0.05935992       D       1     NA     113.2075
6 2018-04-06 14:47:53  Congaree  4.5    0.05935992       D       1     NA     113.2075

#openair package using timeaverage, results in error message
> library(openair)
> seal_20<-timeAverage(
   seal_dives,
   avg.time = "20 sec",
   data.thresh = 0,
   statistic = "mean",
   type = c("diveNum","D_phase"),
   percentile = NA,
   start.date = NA,
   end.date = NA,
   vector.ws = FALSE,
   fill = FALSE
)
Can't find the variable(s) date 
Error in checkPrep(mydata, vars, type = "default", remove.calm = FALSE,  : 


#converting to time series and using period.apply(), but can't find a way to group them by dive #, or use split() then convert to time series.
#create a time series data class from our data frame
> seal_dives$datetime<-as.POSIXct(seal_dives$datetime,tz="GMT")
> seal_xts <- xts(seal_dives, order.by=seal_dives[,1])
> seal_20<-period.apply(seal_xts$Depth, endpoints(seal_xts$datetime, "seconds", 20),  mean)

#split data by dive # but don't know how to do averages over 20 seconds
> seal_split<-split(seal_dives, seal_dives$diveNum)

也许有一种神奇的方法可以做到这一点,我还没有在互联网上找到,或者我只是在我的一种方法中做错了。

【问题讨论】:

【参考方案1】:

您可以使用lubridate 中的floor_date 函数每20 秒对数据进行一次分箱。将它们与diveNumD_phase 一起分组,以使用across 获得其他列的平均值。

library(dplyr)
library(lubridate)

result <- df %>%
  group_by(diveNum, D_phase, datetime = floor_date(datetime, '20 sec')) %>%
  summarise(across(c(Depth, MSA, rate_s, HR), mean, na.rm = TRUE), .groups = 'drop')

result

【讨论】:

谢谢你,Ronak,这正是我想要做的!

以上是关于计算 20 秒间隔内的平均值并按另一列分组的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何按一列分组行并按另一列选择一行?

SQL Server:按分组列求和并按另一列排序

pandas 按另一列的平均值对一列的值进行排序

将每个值除以其组的平均值

新的滚动平均值列,按一列分组并找到另一列的滚动平均值

按另一列值分组和计数