如何解决如果缺少某些年份,是否有一个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
,
您可以创建原始表的副本,但是要减去一年的日期。然后只需将两者在date
和Gini_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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。