R 使用mutate创建一个新变量,其中列有一个变量,该变量基于表中的条件

R 使用mutate创建一个新变量,其中列有一个变量,该变量基于表中的条件,r,dplyr,tidyverse,R,Dplyr,Tidyverse,我正在尝试创建一个名为cpi2000的新变量,该变量取序列中所有观测值的2000年cpi值(我有四个序列,因此为group_by),以便计算通货膨胀调整系数。但是,以下代码仅替换2000年的值,其余年份为NA。基本上,我希望在cpi2000中有四个数字重复,每个系列一个 以下是我的数据标题: Groups: series_id [1] year series_id value seasonal_adj series_name

我正在尝试创建一个名为cpi2000的新变量,该变量取序列中所有观测值的2000年cpi值(我有四个序列,因此为group_by),以便计算通货膨胀调整系数。但是,以下代码仅替换2000年的值,其余年份为NA。基本上,我希望在cpi2000中有四个数字重复,每个系列一个

以下是我的数据标题:

 Groups:   series_id [1]
  year  series_id value seasonal_adj        series_name                                     cpi2000
  <chr> <chr>     <dbl> <chr>               <chr>                                             <dbl>
1 2000  CPIAUCSL   172. seasonally adjusted US city average, all items, seasonally adjusted    172.
2 2001  CPIAUCSL   177. seasonally adjusted US city average, all items, seasonally adjusted     NA 
3 2002  CPIAUCSL   180. seasonally adjusted US city average, all items, seasonally adjusted     NA 
4 2003  CPIAUCSL   184  seasonally adjusted US city average, all items, seasonally adjusted     NA 
5 2004  CPIAUCSL   189. seasonally adjusted US city average, all items, seasonally adjusted     NA 
6 2005  CPIAUCSL   195. seasonally adjusted US city average, all items, seasonally adjusted     NA 
> 
我认为最好的方法是使用if_else语句(case_when似乎不起作用)。如果我能弄清楚如何让if_else语句中的第二个参数(“value[2000])在year==2000时也取值,这就行了,但我无法弄清楚如何在第二个语句中指定条件

最终目标是创建两个变量cpi2000和cpi2019,这样我就可以创建第三个变量cpi_adj=(cpi2019/cpi2000),它可以用作通货膨胀系数


任何帮助都将不胜感激。

我意识到我可以在第二个条件值[year==2000]中指定年份,而不是像使用值[2000]那样对括号位置进行子集。将using 2000进行子集生成“NA”,因为没有第2000行,所以我将使用值[1]因为我想要第一个值。或者,按年份筛选更安全,因为它允许我指定我想要的年份。下面是我使用的代码和输出:

cpi_values_tidy_clean <- cpi_values_tidy %>%  
 separate(date, 
          into = c("year"), 
          sep = "-", 
          extra = "drop") %>%                                                            # separate NAM into three variables 
  group_by(series_id) %>%  
  mutate(cpi2000 = if_else(year == 2000, value, value[year == 2000])) %>%  
  mutate(cpi2019 = if_else(year == 2019, value, value[year == 2019])) %>%  
  glimpse()

  head(cpi_values_tidy_clean)

cpi\u值\u整洁\u干净%
分开(日期,
分为=c(“年”),
sep=“-”,
extra=“drop”)%>%#将NAM分为三个变量
分组依据(序列id)%>%
变异(cpi2000=if_else(年份==2000,值,值[年份==2000]))%>%
突变(cpi2019=if_else(年份==2019,值,值[年份==2019]))%>%
一瞥
水头(cpi_值_整洁_干净)
年份系列\u id值季节性\u adj系列\u名称cpi2000 cpi2019
1 2000年CPIUCSL 172。经季节性调整的美国城市平均值,所有项目,经季节性调整172.256。
2 2001年CPIUCSL 177。经季节性调整的美国城市平均值,所有项目,经季节性调整的172.256。
3 2002年CPIAUSL 180。经季节性调整的美国城市平均值,所有项目,经季节性调整的172.256。
4 2003年CPIUCSL 184经季节性调整的美国城市平均值,所有项目,经季节性调整的172.256。
5 2004年CPIUCSL 189。经季节性调整的美国城市平均值,所有项目,经季节性调整的172.256。
6 2005年CPIUCSL 195。经季节性调整的美国城市平均值,所有项目,经季节性调整172.256。

如果有人知道如何更优雅地使用case\u when,我很乐意看到。

请将
dput(cpi\u values\u tidy)
的输出复制到您的问题中,发布您的数据。如果您的数据集很大,请执行
dput(head(cpi\u values\u tidy))
。当您运行代码时,会出现警告消息。您检查了吗?
[1] 172.192      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA 172.200      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA
[36]      NA      NA      NA      NA      NA      NA      NA 165.717      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA 165.725      NA      NA      NA      NA      NA      NA
[71]      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA      NA

cpi_values_tidy_clean <- cpi_values_tidy %>%  
 separate(date, 
          into = c("year"), 
          sep = "-", 
          extra = "drop") %>%                                                            # separate NAM into three variables 
  group_by(series_id) %>%  
  mutate(cpi2000 = if_else(year == 2000, value, value[year == 2000])) %>%  
  mutate(cpi2019 = if_else(year == 2019, value, value[year == 2019])) %>%  
  glimpse()

  head(cpi_values_tidy_clean)

 year  series_id value seasonal_adj        series_name                                     cpi2000 cpi2019
  <chr> <chr>     <dbl> <chr>               <chr>                                             <dbl>   <dbl>
1 2000  CPIAUCSL   172. seasonally adjusted US city average, all items, seasonally adjusted    172.    256.
2 2001  CPIAUCSL   177. seasonally adjusted US city average, all items, seasonally adjusted    172.    256.
3 2002  CPIAUCSL   180. seasonally adjusted US city average, all items, seasonally adjusted    172.    256.
4 2003  CPIAUCSL   184  seasonally adjusted US city average, all items, seasonally adjusted    172.    256.
5 2004  CPIAUCSL   189. seasonally adjusted US city average, all items, seasonally adjusted    172.    256.
6 2005  CPIAUCSL   195. seasonally adjusted US city average, all items, seasonally adjusted    172.    256.