Stata 恢复每个国家/地区的最后可用观测数据

Stata 恢复每个国家/地区的最后可用观测数据,stata,data-manipulation,data-wrangling,Stata,Data Manipulation,Data Wrangling,我试图只保留每个变量的最后可用观察值,然而,问题是每个国家在不同年份测量的变量不同。我的数据当前如下所示: iso3c year Gini variable1 variable2 variable3 AND 2000 . 1.279314 33 22 AND 2001 22 2.571869

我试图只保留每个变量的最后可用观察值,然而,问题是每个国家在不同年份测量的变量不同。我的数据当前如下所示:

iso3c year  Gini          variable1         variable2                variable3
AND   2000       .          1.279314         33                        22
AND   2001      22          2.571869         .                          .
AND   2002       .          3.492054         .                          .
AND   2003      44          3.89996          .                           
这是我的代码:

gsort + iso3c - year
drop if Gini==. & variable1==.      &     variable2==.       &       variable3==.
bysort iso3c: keep if _n==1 
drop year
我用下面的一个变量进行了尝试,然后运行了其他行,效果很好

drop if Gini==. 
然而,由于我在每个国家的不同年份测量了不同的变量,Stata最终只保留以下内容:

iso3c Gini     variable1            variable2            variable3

AND    44           3.89996          .                   .                               
然而,我想要这样的东西,变量2和变量3的最后一次可用观察也保留在2000年,即使变量不是在2004年测量的

iso3c Gini      variable1            variable2                variable3

AND    44           3.89996          33                        22                
请注意,
collapse(lastnm)Gini variable*,by(iso3c)
是解决此问题的单行解决方案

让我们也展示一下如何从第一原理中得到类似的东西

将非缺失值排序到面板末尾(临时)后,可以访问每个面板中的最后一个非缺失值。如果没有可用的非缺失值,则必须返回缺失值

clear 
input str3 iso3c year Gini variable1 variable2 variable3
AND 2000 . 1.279314 33 22
AND 2001 22 2.571869 . .
AND 2002 . 3.492054 . .
AND 2003 44 3.89996 . . 
end 

gen OK = . 

foreach v in Gini variable1 variable2 variable3 { 
    replace OK = !missing(`v')
    bysort iso3c (OK year) : gen `v'_lnm = `v'[_N] 
}

sort iso3c year 
list iso3c year *lnm 

     +----------------------------------------------------------+
     | iso3c   year   Gini_lnm   va~1_lnm   va~2_lnm   va~3_lnm |
     |----------------------------------------------------------|
  1. |   AND   2000         44    3.89996         33         22 |
  2. |   AND   2001         44    3.89996         33         22 |
  3. |   AND   2002         44    3.89996         33         22 |
  4. |   AND   2003         44    3.89996         33         22 |
     +----------------------------------------------------------+
请注意,
collapse(lastnm)Gini variable*,by(iso3c)
是解决此问题的单行解决方案

让我们也展示一下如何从第一原理中得到类似的东西

将非缺失值排序到面板末尾(临时)后,可以访问每个面板中的最后一个非缺失值。如果没有可用的非缺失值,则必须返回缺失值

clear 
input str3 iso3c year Gini variable1 variable2 variable3
AND 2000 . 1.279314 33 22
AND 2001 22 2.571869 . .
AND 2002 . 3.492054 . .
AND 2003 44 3.89996 . . 
end 

gen OK = . 

foreach v in Gini variable1 variable2 variable3 { 
    replace OK = !missing(`v')
    bysort iso3c (OK year) : gen `v'_lnm = `v'[_N] 
}

sort iso3c year 
list iso3c year *lnm 

     +----------------------------------------------------------+
     | iso3c   year   Gini_lnm   va~1_lnm   va~2_lnm   va~3_lnm |
     |----------------------------------------------------------|
  1. |   AND   2000         44    3.89996         33         22 |
  2. |   AND   2001         44    3.89996         33         22 |
  3. |   AND   2002         44    3.89996         33         22 |
  4. |   AND   2003         44    3.89996         33         22 |
     +----------------------------------------------------------+