首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何创建依赖于以前观察到的事件平均值的列?

如何创建依赖于以前观察到的事件平均值的列?
EN

Stack Overflow用户
提问于 2022-07-11 11:27:27
回答 2查看 61关注 0票数 2

在下面的数据中,我们观察到某个国家的实际GDP随时间的增长。我的目标是创建一个变量,包括三个类别: 0=无危机、1=危机、2=严重危机。这将把经济危机定义为增长率至少达到一个(危机)或两个(严重)标准差低于前三年增长趋势平均值的年份。

有人能给我指点吗?

代码语言:javascript
运行
复制
growth  year
    5   1990
    4   1991
    0   1992
    -4  1993
    -3  1994
    -1  1995
    2   1996
    4   1997
    7   1998
    10  1999
    8   2000
    -10 2001
    -8  2002
    2   2003
    4   2004
    5   2005
    8   2006
    4   2007
    -10 2008
    -9  2009
    -8  2010
    -3  2011
    0   2012
    -5  2013
    -6  2014
    -2  2015
    4   2016
    5   2017
    5   2018
    8   2019
    2   2020
    -1  2021
    -1  2022

以下是数据:

代码语言:javascript
运行
复制
df=structure(list(gdp_growth = c(5, 4, 0, -4, -3, -1, 2, 4, 7, 10, 
    8, -10, -8, 2, 4, 5, 8, 4, -10, -9, -8, -3, 0, -5, -6, -2, 4, 
    5, 5, 8, 2, -1, -1), year = c(1990, 1991, 1992, 1993, 1994, 1995, 
    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 
    2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 
    2018, 2019, 2020, 2021, 2022)), row.names = c(NA, -33L), class = "data.frame")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-11 11:53:06

您可以在lagrowwise*和mutate中使用dplyr

代码语言:javascript
运行
复制
library(dplyr)

df |>
  mutate(gdp3_growth_lag1 = lag(gdp_growth, 1),
         gdp3_growth_lag2 = lag(gdp_growth, 2),
         gdp3_growth_lag3 = lag(gdp_growth, 3)) |>
  rowwise() |>
    mutate(
      gdp3_growth_mean = mean(c_across(starts_with("gdp3_growth_lag"))),
      gdp3_growth_sd = sd(c_across(starts_with("gdp3_growth_lag")))
    ) |>
  ungroup() |>
  mutate(crisis = case_when(gdp_growth <= gdp3_growth_mean - 2 * gdp3_growth_sd ~ 2,
                            gdp_growth <= gdp3_growth_mean - gdp3_growth_sd ~ 1,
                            is.na(gdp3_growth_mean) ~ NA_real_,
                            TRUE ~ 0)) |>
  select(-starts_with("gdp3"))

输出:

代码语言:javascript
运行
复制
# A tibble: 33 × 3
   gdp_growth  year crisis
        <dbl> <dbl>  <dbl>
 1          5  1990     NA
 2          4  1991     NA
 3          0  1992     NA
 4         -4  1993      2
 5         -3  1994      0
 6         -1  1995      0
 7          2  1996      0
 8          4  1997      0
 9          7  1998      0
10         10  1999      0
11          8  2000      0
12        -10  2001      2
13         -8  2002      0
14          2  2003      0
15          4  2004      0
16          5  2005      0
17          8  2006      0
18          4  2007      0
19        -10  2008      2
20         -9  2009      1
21         -8  2010      0
22         -3  2011      0
23          0  2012      0
24         -5  2013      0
25         -6  2014      1
26         -2  2015      0
27          4  2016      0
28          5  2017      0
29          5  2018      0
30          8  2019      0
31          2  2020      2
32         -1  2021      2
33         -1  2022      0

更新完整输出。

(*) rowSdsmatrixStats中也有

票数 1
EN

Stack Overflow用户

发布于 2022-07-11 11:54:39

从您的描述中,听起来似乎您首先需要计算增长的滚动平均值,然后将本年度的增长与此进行比较:

代码语言:javascript
运行
复制
library(dplyr)

df %>% 
  mutate(mn = zoo::rollmean(gdp_growth, 3, na.pad = TRUE, align = 'right'),
         crisis = ifelse(gdp_growth < (mn - sd(gdp_growth)),
                         ifelse(gdp_growth < (mn - 2 * sd(gdp_growth)),
                                2, 1), 0)) %>%
  select(-mn)

#>    gdp_growth year crisis
#> 1           5 1990     NA
#> 2           4 1991     NA
#> 3           0 1992      0
#> 4          -4 1993      0
#> 5          -3 1994      0
#> 6          -1 1995      0
#> 7           2 1996      0
#> 8           4 1997      0
#> 9           7 1998      0
#> 10         10 1999      0
#> 11          8 2000      0
#> 12        -10 2001      2
#> 13         -8 2002      0
#> 14          2 2003      0
#> 15          4 2004      0
#> 16          5 2005      0
#> 17          8 2006      0
#> 18          4 2007      0
#> 19        -10 2008      1
#> 20         -9 2009      0
#> 21         -8 2010      0
#> 22         -3 2011      0
#> 23          0 2012      0
#> 24         -5 2013      0
#> 25         -6 2014      0
#> 26         -2 2015      0
#> 27          4 2016      0
#> 28          5 2017      0
#> 29          5 2018      0
#> 30          8 2019      0
#> 31          2 2020      0
#> 32         -1 2021      0
#> 33         -1 2022      0
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72937835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档