【问题标题】:Adding the first non-missing observation across columns跨列添加第一个非缺失观察
【发布时间】:2019-05-01 19:59:13
【问题描述】:

我目前有多个模型存在偏差,如下数据所示:

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

我假设我必须做一个循环,但我不知道如何去做。


编辑:

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

【问题讨论】:

    标签: loops foreach stata


    【解决方案1】:

    以下对我有用:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-08
        • 2017-12-08
        • 1970-01-01
        • 2019-12-28
        • 2021-06-08
        • 1970-01-01
        • 2021-09-03
        • 1970-01-01
        相关资源
        最近更新 更多