跨列添加第一个非缺失观测值

时间:2019-05-01 19:59:13

标签: loops foreach stata

我目前在一些型号上有偏差,如下数据所示:

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

Model_2015中执行的变量2015具有201620172018的偏差; Model_20162017的变量2018,依此类推。

我想创建一个变量,将每个变量的第一次观察值相加。

因此对于此示例:

first = 15 + 10 + 30 = 55

我假设我必须做一个循环,但是我对如何处理感到困惑。


编辑:

理想情况下,我也想添加第二,第三等非缺失观测值的解决方案。

2 个答案:

答案 0 :(得分:2)

以下对我有用:

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 |
     +-----------------------------------------------------+

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

答案 1 :(得分:2)

下面的代码可能是您要寻找的循环:

forvalues i = 1 / `=_N' {
    generate S_`i' = 0
    forvalues j = `i' / `=_N' {
        capture replace S_`i' = S_`i' + model_`=2015+`j'-`i''[`j']
    }
}