如果缺少某些年份,是否有一个R函数可以通过将国家/地区分组来帮助将变量滞后一年?

问题描述

我在各个论坛中进行了搜索,但未完全找到我问题的答案。我有世界银行的数据集

--experimentalDecorators --moduleResolution mode

然后我尝试将这一估计值滞后一年

library(wbstats)
Gini <- wb(indicator = c("SI.POV.GINI"),startdate = 2005,enddate = 2020)
Gini <- Gini[,c("iso3c","date","value")]
names(Gini)
names(Gini)<-c("iso3c","Gini")
#Change date to numeric
class(Gini$date)
Gini$date<-as.numeric(Gini$date)

#Tibble:
# A tibble: 1,012 x 3
   iso3c  date  Gini
   <chr> <dbl> <dbl>
 1 ALB    2017  33.2
 2 ALB    2016  33.7
 3 ALB    2015  32.9
 4 ALB    2014  34.6
 5 ALB    2012  29  
 6 ALB    2008  30  
 7 ALB    2005  30.6
 8 DZA    2011  27.6
 9 AGO    2018  51.3
10 AGO    2008  42.7
# … with 1,002 more rows

不幸的是,我的问题是,当缺少年份时,滞后并不能识别出年份的缺失,而只是将最近的年份作为滞后。例如:“ ALB”国家/地区的基尼估计在2012年不会滞后一年,而在第二年(2008年)会滞后。

我希望最终数据看起来相同,但是我如何在下面进行编辑-理想的情况是能够滞后多年:

#Lag Gini
lg <- function(x)c(NA,x[1:(length(x)-1)])

Lagged.Gini<-ddply(Gini,~ iso3c,transform,Gini.lag.1 = lg(Gini))

tibble(Lagged.Gini)

# A tibble: 1,032 x 4
   iso3c  date  Gini Gini.lag.1
   <chr> <dbl> <dbl>      <dbl>
 1 AGO    2018  51.3       NA  
 2 AGO    2008  42.7       51.3
 3 ALB    2017  33.2       NA  
 4 ALB    2016  33.7       33.2
 5 ALB    2015  32.9       33.7
 6 ALB    2014  34.6       32.9
 7 ALB    2012  29         34.6
 8 ALB    2008  30         29  
 9 ALB    2005  30.6       30  
10 ARE    2014  32.5       NA  

解决方法

pseudospin的答案对于基数R非常有用。由于您使用的是小字,因此这是一个具有相同效果的tidyverse版本:

Gini <- readr::read_table("
iso3c  date  Gini
ALB    2017  33.2
ALB    2016  33.7
ALB    2015  32.9
ALB    2014  34.6
ALB    2012  29  
ALB    2008  30  
ALB    2005  30.6
DZA    2011  27.6
AGO    2018  51.3
AGO    2008  42.7")

library(dplyr)
Gini %>%
  transmute(iso3c,date = date - 1,Gini.lag.1 = Gini) %>%
  full_join(Gini,.,by = c("iso3c","date")) %>%
  arrange(iso3c,desc(date))
# # A tibble: 17 x 4
#    iso3c  date  Gini Gini.lag.1
#    <chr> <dbl> <dbl>      <dbl>
#  1 AGO    2018  51.3       NA  
#  2 AGO    2017  NA         51.3
#  3 AGO    2008  42.7       NA  
#  4 AGO    2007  NA         42.7
#  5 ALB    2017  33.2       NA  
#  6 ALB    2016  33.7       33.2
#  7 ALB    2015  32.9       33.7
#  8 ALB    2014  34.6       32.9
#  9 ALB    2013  NA         34.6
# 10 ALB    2012  29         NA  
# 11 ALB    2011  NA         29  
# 12 ALB    2008  30         NA  
# 13 ALB    2007  NA         30  
# 14 ALB    2005  30.6       NA  
# 15 ALB    2004  NA         30.6
# 16 DZA    2011  27.6       NA  
# 17 DZA    2010  NA         27.6

如果您需要进行n次(每次延迟一次),则可以通过编程方式将其扩展:

Ginilags <- lapply(1:3,function(lg) {
  z <- transmute(Gini,iso3c,date = date - lg,Gini)
  names(z)[3] <- paste0("Gini.lag.",lg)
  z
})
Reduce(function(a,b) full_join(a,b,"date")),c(list(Gini),Ginilags)) %>%
  arrange(iso3c,desc(date))
# # A tibble: 28 x 6
#    iso3c  date  Gini Gini.lag.1 Gini.lag.2 Gini.lag.3
#    <chr> <dbl> <dbl>      <dbl>      <dbl>      <dbl>
#  1 AGO    2018  51.3       NA         NA         NA  
#  2 AGO    2017  NA         51.3       NA         NA  
#  3 AGO    2016  NA         NA         51.3       NA  
#  4 AGO    2015  NA         NA         NA         51.3
#  5 AGO    2008  42.7       NA         NA         NA  
#  6 AGO    2007  NA         42.7       NA         NA  
#  7 AGO    2006  NA         NA         42.7       NA  
#  8 AGO    2005  NA         NA         NA         42.7
#  9 ALB    2017  33.2       NA         NA         NA  
# 10 ALB    2016  33.7       33.2       NA         NA  
# # ... with 18 more rows
,

您可以创建原始表的副本,但是要减去一年的日期。然后只需将两者在dateGini_lagged <- data.frame( iso3c = Gini$iso3c,date = Gini$date-1,Gini.lag.1 = Gini$Gini) merge(Gini,Gini_lagged,all=TRUE) 列上连接在一起即可得到最终结果。

{{1}}
,

使用tidyverse中的dplyr和tidyr,您可以进行逐行突变来查找与当前行中的年份减1匹配的年份。

library(tidyverse)

Gini %>%
     rowwise() %>%
     mutate(Gini.lag.1 = list(Gini$Gini[date-1 == Gini$date])) %>%
     unnest(c(Gini.lag.1),keep_empty = T)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...