如何计算 R 中每个日期测量次数不同的测量的 3 天中心滚动平均值?

问题描述 投票:0回答:1

我在 r 中有一个数据集,其中包含不同日期的不同奶牛测量的甲烷测量值。数据集的结构如下: ID:每头牛的标识符(整数)。 measure_date:进行测量的日期(日期)。 ch4:甲烷测量值(数字)。 每个日期可以有多个测量值,有些日期可能根本没有任何测量值,因此它们不会出现在数据集中。我需要考虑日期范围内的所有可用测量值,计算每只动物 (id) 的甲烷测量值 (ch4) 的 3 天中心滚动平均值。 关键要求:每个日期多次测量:数据集包括某些日期的多次测量,但另一个日期可能有完全不同的数字,具体取决于动物进入饲料箱的次数,并且有些日子可能没有测量结果。如果日期没有测量值,它实际上不会在数据中显示为一行,但如果需要,我可以轻松添加这些行。 3 天中心滚动平均值:滚动平均值应在以每个日期为中心的 3 天窗口内计算。例如,1 月 2 日的滚动平均值应考虑 1 月 1 日、2 日和 3 日的所有测量值。 按动物分组:应分别对每只动物 (ID) 进行滚动平均值计算,以确保一只动物的计算不会影响另一只动物。 示例数据集:以下是一个技术 ID 的数据集的一小部分示例: Meausre_date = c(2023-01-01, 2023-01-01, 2023-01-01, 2023-01-01, 2023-01-02, 2023-01-03 2023-01-03, 2023-01-05 ) Ch4 = c(200, 250, 233, 256, 270, 256, 290, 299) 所需的输出:对于每个 techid,我想生成一个新列,其中包括: 原始日期(包括那些没有测量值的日期)。每个日期的平均 3 天中心滚动平均甲烷测量值。 摘要:总而言之,我需要一种有效的方法来计算每只动物的甲烷测量值的 3 天中心滚动平均值,考虑到每个日期的不同数量的测量值并包括序列中没有测量值的日期。 到目前为止,我所见过和尝试过的所有方法都无法处理每个measure_date上不同数量的度量。 (这是一个非常大的数据集) 数据集示例

我想我错过了一些简单的东西或者只是从错误的角度攻击这个问题。 (更改了代码和数据集中的一些变量名称,这就是存在差异的原因)

r loops average rolling-average
1个回答
0
投票

使用末尾注释中可重复显示的数据,定义一个采用居中平均值

Mean
的函数,然后对于每个
tech_id
使用
complete
插入缺失的日期来完成日期,然后对其运行
Mean
.

library (dplyr)
library(tidyr)

Mean <- function(x, y) {
  x <- as.numeric(x)
  sapply(x, function(z) mean(y[x %in% seq(z-1, z+1)], na.rm = TRUE))
}

DF %>%
  mutate(Measure_date = as.Date(Measure_date)) %>%
  group_by(tech_id) %>%
  complete(Measure_date = seq(min(Measure_date), max(Measure_date), by="day")) %>%
 mutate(Mean = Mean(Measure_date, Ch4) ) %>% 
  ungroup

给予

# A tibble: 9 × 4
  tech_id Measure_date   Ch4  Mean
    <dbl> <date>       <dbl> <dbl>
1       1 2023-01-01     200  242.
2       1 2023-01-01     250  242.
3       1 2023-01-01     233  242.
4       1 2023-01-01     256  242.
5       1 2023-01-02     270  251.
6       1 2023-01-03     256  272 
7       1 2023-01-03     290  272 
8       1 2023-01-04      NA  282.
9       1 2023-01-05     299  299 

注意

DF <- data.frame(tech_id = 1,
Measure_date = c("2023-01-01", "2023-01-01", "2023-01-01", "2023-01-01", 
  "2023-01-02", "2023-01-03", "2023-01-03", "2023-01-05"), 
Ch4 = c(200, 250, 233, 256, 270, 256, 290, 299))
© www.soinside.com 2019 - 2024. All rights reserved.