首页 > 解决方案 > 跨列添加第一个非缺失观察

问题描述

我目前有许多模型的偏差,如下面的数据所示:

year   model_2015   model_2016   model_2017
2016      15            .           . 
2017      20           10           .
2018      30           20           30

变量Model_2015, 执行2015, 有偏差2016, 2017, 2018; 和 的变量Model_2016,以此类推。20172018

我想创建一个变量来总结每个人的第一次观察。

所以对于这个例子:

first = 15 + 10 + 30 = 55

我假设我必须做一个循环,但我很难过如何去做。


编辑:

理想情况下,我还想要一个添加第二个、第三个等非缺失观察的解决方案。

标签: loopsforeachstata

解决方案


以下对我有用:

generate first = model_2015[1] + model_2016[2] + model_2017[3]

但是,这是一种更通用的方法:

clear

input year   model_2015   model_2016   model_2017
2016      15            .           . 
2017      20           10           .
2018      30           20           30
end

generate id = 1
tempfile myfile
save `myfile'

collapse (firstnm) model*, by(id)
egen first = rowtotal(model*)
keep id first
merge 1:m id using `myfile'

drop id _merge
order year model* first

list, abbreviate(15)

     +-----------------------------------------------------+
     | year   model_2015   model_2016   model_2017   first |
     |-----------------------------------------------------|
  1. | 2016           15            .            .      55 |
  2. | 2017           20           10            .      55 |
  3. | 2018           30           20           30      55 |
     +-----------------------------------------------------+

编辑:

下面,是一个更通用的解决方案:

clear

input year   model_2015   model_2016   model_2017
2016      15            .           . 
2017      20           10           .
2018      30           20           30
2019      40           10           10
end

local i = 0
foreach v of varlist model* {
    local ++i
    local vals
    forvalues j = 1 / `=_N' {
        if !missing(`v'[`j']) local vals `vals' `=`v'[`j']'
    }
    local ind_`i' `: word 1 of `vals'' // CHANGE THIS NUMBER
    local ind_all `ind_all' `ind_`i''
}
generate first = `= subinstr("`ind_all'", " ", "+", `= wordcount("`ind_all'") - 1')'

结果:

list, abbreviate(15)

     +-----------------------------------------------------+
     | year   model_2015   model_2016   model_2017   first |
     |-----------------------------------------------------|
  1. | 2016           15            .            .      55 |
  2. | 2017           20           10            .      55 |
  3. | 2018           30           20           30      55 |
  4. | 2019           40           10           10      55 |
     +-----------------------------------------------------+

     +-----------------------------------------------------+
     | year   model_2015   model_2016   model_2017  second |
     |-----------------------------------------------------|
  1. | 2016           15            .            .      50 |
  2. | 2017           20           10            .      50 |
  3. | 2018           30           20           30      50 |
  4. | 2019           40           10           10      50 |
     +-----------------------------------------------------+

     +-----------------------------------------------------+
     | year   model_2015   model_2016   model_2017   third |
     |-----------------------------------------------------|
  1. | 2016           15            .            .      40 |
  2. | 2017           20           10            .      40 |
  3. | 2018           30           20           30      40 |
  4. | 2019           40           10           10      40 |
     +-----------------------------------------------------+

请注意,在这种情况下,为了更好地说明,我使用了一个稍作修改的示例。


推荐阅读