r - 提取滞后数据,但仅针对 R 中的特定季节
问题描述
我有一个包含两个变量的特定数据集。一个是数字,另一个是标识数字数据来自的季节和年份的字符。这是数据头部的样子:
SeasonYear mean
<chr> <dbl>
1 winter2000 0.957
2 spring2000 0.943
3 summer2000 1.03
4 fall2000 0.981
5 winter2001 1.06
6 spring2001 1.05
7 summer2001 1.02
8 fall2001 1.03
9 winter2002 1.02
10 spring2002 1.05
现在我希望拉出这些数据的滞后,但仅限于前一个春天,以便我的数据看起来像这样:
SeasonYear mean lag
<chr> <dbl> <dbl>
1 winter2000 0.957 NA
2 spring2000 0.943 NA
3 summer2000 1.03 0.943
4 fall2000 0.981 0.943
5 winter2001 1.06 0.943
6 spring2001 1.05 0.943
7 summer2001 1.02 1.05
8 fall2001 1.03 1.05
9 winter2002 1.02 1.05
10 spring2002 1.05 1.05
我也希望返回 2 个弹簧,以便我的数据看起来像这样:
SeasonYear mean lag
<chr> <dbl> <dbl>
1 winter2000 0.957 NA
2 spring2000 0.943 NA
3 summer2000 1.03 NA
4 fall2000 0.981 NA
5 winter2001 1.06 NA
6 spring2001 1.05 NA
7 summer2001 1.02 0.943
8 fall2001 1.03 0.943
9 winter2002 1.02 0.943
10 spring2002 1.05 0.943
我知道我可以使用该lag()
函数来获取数据框中的先前数据,但我正在寻找一种方法来指定一个函数,该函数会像我提到的那样拉动特定类型的滞后。
解决方案
实现所需结果的一种选择可能如下所示:
- 将您的 SeasonYear 拆分为季节和年份
- 添加一列,其中包含每年春季的值
- 考虑到秋季和夏季的第 (n-1) 个滞后,得到第 n 个滞后
library(tidyr)
library(dplyr)
lag_spring <- function(x, y, n = 1) {
data.frame(x = x, season_year = y) %>%
tidyr::extract(season_year, into = c("season", "year"), regex = "^(.+?)(\\d{4})$") %>%
group_by(year) %>%
mutate(springmean = x[season == "spring"]) %>%
ungroup() %>%
group_by(season) %>%
mutate(lag = ifelse(!season %in% c("summer", "fall"), lag(springmean, n = n), lag(springmean, n = n - 1))) %>%
ungroup() %>%
pull(lag)
}
dd %>%
mutate(lag = lag_spring(mean, SeasonYear))
#> SeasonYear mean lag
#> 1 winter2000 0.957 NA
#> 2 spring2000 0.943 NA
#> 3 summer2000 1.030 0.943
#> 4 fall2000 0.981 0.943
#> 5 winter2001 1.060 0.943
#> 6 spring2001 1.050 0.943
#> 7 summer2001 1.020 1.050
#> 8 fall2001 1.030 1.050
#> 9 winter2002 1.020 1.050
#> 10 spring2002 1.050 1.050
dd %>%
mutate(lag = lag_spring(mean, SeasonYear, n = 2))
#> SeasonYear mean lag
#> 1 winter2000 0.957 NA
#> 2 spring2000 0.943 NA
#> 3 summer2000 1.030 NA
#> 4 fall2000 0.981 NA
#> 5 winter2001 1.060 NA
#> 6 spring2001 1.050 NA
#> 7 summer2001 1.020 0.943
#> 8 fall2001 1.030 0.943
#> 9 winter2002 1.020 0.943
#> 10 spring2002 1.050 0.943
数据
dd <- structure(list(SeasonYear = c(
"winter2000", "spring2000", "summer2000",
"fall2000", "winter2001", "spring2001", "summer2001", "fall2001",
"winter2002", "spring2002"
), mean = c(
0.957, 0.943, 1.03, 0.981,
1.06, 1.05, 1.02, 1.03, 1.02, 1.05
)), class = "data.frame", row.names = c(
"1",
"2", "3", "4", "5", "6", "7", "8", "9", "10"
))
推荐阅读
- ios - 如何使用 Realm 和 Swift 从 TableView 中删除部分和行?
- c# - 使用 XPath 向多个元素添加元素无法按预期工作
- c# - 如何获取 DB 关系的一行中的所有值并将它们中的每一个分配给 ASP.NET C# 中的变量
- c - 功能故障
- javascript - 实现搜索功能的问题“TypeError:data.filter 不是函数”
- entity-framework-core - 使用 EF Core 获取 Long 列表
- python - 如何将列表的多个元素传递给自定义函数中的参数 - Python
- c# - 我的播放器不会坚持使用平台,我似乎无法找到解决方案
- go - 是否可以在不运行 go install 的情况下更新本地软件包?
- java - 将字母数字字符串转换为双精度