在下面的数据中,我们观察到一个国家的虚拟GDP随着时间的推移而增长.我的目标是创建一个包含三类的变量:0=无危机,1=危机,2=严重危机.那就是身份

能给我一些指导吗?

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

以下是数据:

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")
    

推荐答案

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

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"))

Output:

# 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

Updated with full output.

(*)matrixStats中也有rowSds

R相关问答推荐

如何判断某列中由某些行组成的百分比

如何使用shinyChatR包配置聊天机器人

计算R中的威布尔分布的EDF

如何自定义Shapviz图?

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

迭代通过1个长度的字符串长字符R

如何直接从R中的风险分数计算c指数?

当我们有多个反斜杠和/特殊字符时使用Gsubing

将选定的索引范围与阈值进行比较

仅在R中的数据集开始和结束时删除所有 Select 列的具有NA的行

将项粘贴到向量中,并将它们分组为x的倍数,用空格分隔

在具有多个响应变量的比例堆叠条形图上方添加总计

如何筛选截止年份之前最后一个测量年度的所有观测值以及截止年份之后所有年份的所有观测值

从线的交点创建面

在同一单元格中创建包含整数和百分比的交叉表

如何在shiny 的应用程序 map 视图宣传单中可视化单点

基于R中的引用将向量值替换为数据框列的值

使用dplyr删除具有条件的行

从字符串列中的向量中查找第一个匹配的单词

如何在R曲线图弹出窗口中更改r和theta标签