Добавление первого не пропущенного наблюдения по столбцам - PullRequest
1 голос
/ 01 мая 2019

У меня в настоящее время есть отклонения для ряда моделей, как показано в данных ниже:

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

Переменная Model_2015, выполненная в 2015, имеет отклонения для 2016, 2017, 2018; переменная Model_2016 для 2017, а также 2018 и т. д.

Я хотел бы создать переменную, которая суммирует первое наблюдение каждого.

Итак, для этого примера:

first = 15 + 10 + 30 = 55

Я предполагаю, что мне нужно сделать цикл, но я не знаю, как это сделать.


EDIT:

В идеале мне бы хотелось, чтобы решение добавляло второе, третье и т. Д. Не пропущенные наблюдения.

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Код ниже может быть циклом, который вы ищете:

forvalues i = 1 / `=_N' {
    generate S_`i' = 0
    forvalues j = `i' / `=_N' {
        capture replace S_`i' = S_`i' + model_`=2015+`j'-`i''[`j']
    }
}
2 голосов
/ 01 мая 2019

Для меня работает следующее:

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

Обратите внимание, что в этом случае я использовал слегка модифицированный пример для лучшей иллюстрации.

...