我有面板数据:
日期 | 身份证 | 价值 |
---|---|---|
周一 | 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。我还想要滚动中位数。
这是一个包含
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