R 中面板数据的滚动平均值和中位数

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

我有面板数据:

日期 身份证 价值
周一 A 10
周二 A 11
周三 A 15
周四 A 12
周一 B 11
周二 B 13
周三 B 12
周四 B 13
周一 C 14
周二 C 10
周三 C 13
周四 C 12

我想创建一个新列,它是所有 3 个 ID 的滚动平均值,例如 K = 2。

所以最后我应该有这样的东西:

日期 身份证 价值 滚动平均值
周一 A 10 不适用
周二 A 11 不适用
周三 A 15 11.5
周四 A 12 12.5
周一 B 11 不适用
周二 B 13 不适用
周三 B 12 11.5
周四 B 13 12.5
周一 C 14 不适用
周二 C 10 不适用
周三 C 13 11.5
周四 C 12 12.5

我厌倦了以下但似乎不起作用:

df_mean<-  df %>% 
  group_by(Date) %>% 
  mutate(RollingMean = rollmean(Value, n = 2)) %>% 
  ungroup()

有什么想法吗?我的目标是随后在同一图上绘制 SMA 和其他 ID。我还想要滚动中位数。

r group-by rolling-computation panel-data
1个回答
0
投票

这是一个包含

rollmeanr
包中的
zoo
的解决方案。数据按
ID
分组,而不是像问题中那样按日期分组。

df1 <- read.table(text = "
Date    ID  Value
Mon     A   10
Tue     A   11
Wed     A   15
Thu     A   12
Mon     B   11
Tue     B   13
Wed     B   12
Thu     B   13
Mon     C   14
Tue     C   10
Wed     C   13
Thu     C   12", header = TRUE)

suppressPackageStartupMessages({
  library(dplyr)
})

df1 %>% 
  group_by(ID) %>% 
  mutate(RollingMean = zoo::rollmeanr(Value, k = 2, fill = NA_real_)) %>% 
  ungroup()
#> # A tibble: 12 × 4
#>    Date  ID    Value RollingMean
#>    <chr> <chr> <int>       <dbl>
#>  1 Mon   A        10        NA  
#>  2 Tue   A        11        10.5
#>  3 Wed   A        15        13  
#>  4 Thu   A        12        13.5
#>  5 Mon   B        11        NA  
#>  6 Tue   B        13        12  
#>  7 Wed   B        12        12.5
#>  8 Thu   B        13        12.5
#>  9 Mon   C        14        NA  
#> 10 Tue   C        10        12  
#> 11 Wed   C        13        11.5
#> 12 Thu   C        12        12.5

创建于 2023-09-04,使用 reprex v2.0.2


请注意,滚动中位数比较棘手。如果窗口宽度为

k = 2
,则与这 2 个向量元素的平均值没有差异。这是在
RollingMedian2
中计算的。如果你想要
k = 3
,那么你可以使用
rollmedianr
,它需要奇数宽度的窗口。
RollingMedian3
就是这种情况。

df1 %>% 
  group_by(ID) %>% 
  mutate(RollingMean = zoo::rollmeanr(Value, k = 2, fill = NA_real_),
         RollingMedian2 = zoo::rollapplyr(Value, width = 2, FUN = median, fill = NA_real_),
         RollingMedian3 = zoo::rollmedianr(Value, k = 3, fill = NA_real_)) %>% 
  ungroup()
#> # A tibble: 12 × 6
#>    Date  ID    Value RollingMean RollingMedian2 RollingMedian3
#>    <chr> <chr> <int>       <dbl>          <dbl>          <dbl>
#>  1 Mon   A        10        NA             NA               NA
#>  2 Tue   A        11        10.5           10.5             NA
#>  3 Wed   A        15        13             13               11
#>  4 Thu   A        12        13.5           13.5             12
#>  5 Mon   B        11        NA             NA               NA
#>  6 Tue   B        13        12             12               NA
#>  7 Wed   B        12        12.5           12.5             12
#>  8 Thu   B        13        12.5           12.5             13
#>  9 Mon   C        14        NA             NA               NA
#> 10 Tue   C        10        12             12               NA
#> 11 Wed   C        13        11.5           11.5             13
#> 12 Thu   C        12        12.5           12.5             12

创建于 2023-09-04,使用 reprex v2.0.2

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