有没有一种方法可以根据R中的ID和数据帧计算多个移动平均线?

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

我正在分析数据,想一次计算许多移动平均线。我将在这里举一个我正在尝试做的事情的例子。

表 1:ID 和日期

IDDate <- data.frame(ID = c("A","B","C"), 
Stage1 = c(12, 13, 10), 
Stage2 = c(14, 30, 12))
身份证 第一阶段 第二阶段
A 12 14
B 13 30
C 10 12

表2:每日温度数据

IDTemp <- data.frame(Day = c(1:12), 
A = c(-3,-2,1,4,2,3,10,15,5,4,6,4), 
B = c(-4,2,0,3,12,10,9,8,9,3,1,2), 
C = c(4,1,2,5,5,2,3,2,1,5,6,1))
A B C
1 -3 -4 4
2 -2 2 1
3 1 0 2
4 4 3 5
5 2 12 5
6 3 10 2
7 10 9 3
8 15 8 2
9 5 9 1
10 4 3 5
11 6 1 6
12 4 2 1

我想计算表 1 中列出的日期前 4 天每个 ID 的每个温度的平均值。这意味着,对于第 1 阶段,我需要 A 的第 9-12 天的温度。如果至少有一天没有温度数据,那么它应该返回 NA。

结果应该是这样的。

表 3:期望的结果

身份证 第一阶段温度 第 2 阶段温度
A 4,75 不适用
B 不适用 不适用
C 2,75 3,25

我已经看到了根据特定结束日期计算滚动平均值的方法,但对于多个结束日期我没有找到任何东西。但是,如果这是一个重复的主题,我们深表歉意。

在动物园中使用 rollmean 我不确定如何指定必要的参数来限制平均值仅在特定(但变化)的时间窗口中计算。

r statistics average moving-average
1个回答
0
投票

我们需要做的就是:

IDDate <- data.frame(ID = c("A","B","C"), 
                     Stage1 = c(12, 13, 10), 
                     Stage2 = c(14, 30, 12))


IDTemp <- data.frame(Day = c(1:12), 
                     A = c(-3,-2,1,4,2,3,10,15,5,4,6,4), 
                     B = c(-4,2,0,3,12,10,9,8,9,3,1,2), 
                     C = c(4,1,2,5,5,2,3,2,1,5,6,1))

new_df <- t(
  sapply(X = unique(IDDate$ID), 
         FUN = \(x) { sapply(
           X = IDDate[IDDate$ID == x, 2:3], 
           FUN = \(j) mean( IDTemp[(j - 3L):j, x] ))
           }
         )
  )

new_df
#>   Stage1 Stage2
#> A   4.75     NA
#> B     NA     NA
#> C   2.75   3.25

创建于 2023-11-22,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.