Генерация значений для столбцов между диапазонами - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть следующий набор данных

A       B      begin_yr       end_yr
asset  brown    2007            2010
asset  blue     2008            2008
basics caramel  2015            2015
cows    dork    2004            2006

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

Я расширял для каждого года:

gen x = end_yr - begin_yr
expand x +1

Это дает мне следующее:

A         B      begin_yr       end_yr    x
asset   brown     2007            2010    3
asset   brown     2007            2010    3
asset   brown     2007            2010    3
asset   brown     2007            2010    3
asset   blue      2008            2008    0
basics  caramel   2015            2015    0
cows    dork      2004            2006    2

В конечном счете, я хочу следующий набор данных:

A         B      begin_yr       end_yr    x    year
asset   brown     2007            2010    3    2007
asset   brown     2007            2010    3    2008
asset   brown     2007            2010    3    2009
asset   brown     2007            2010    3    2010
asset   blue      2008            2008    0    2008
basics  caramel   2015            2015    0    2015
cows    dork      2004            2006    2    2004
cows    dork      2004            2006    2    2005
cows    dork      2004            2006    2    2006

Это то, что у меня пока есть:

gen year = begin_yr if begin_yr!=end_yr

Как мне заполнить оставшуюся переменную year?

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вот извращение, основанное на коде @Pearly Spencer:

clear

input strL A  strL B begin_yr  end_yr
asset  brown    2007            2010
basics caramel  2015            2015
cows    dork    2004            2006
end

gen toexpand = end - begin + 1 

expand toexpand 

bysort A : gen year = begin + _n  - 1 

list, sepby(A) 

     +--------------------------------------------------------+
     |      A         B   begin_yr   end_yr   toexpand   year |
     |--------------------------------------------------------|
  1. |  asset     brown       2007     2010          4   2007 |
  2. |  asset     brown       2007     2010          4   2008 |
  3. |  asset     brown       2007     2010          4   2009 |
  4. |  asset     brown       2007     2010          4   2010 |
     |--------------------------------------------------------|
  5. | basics   caramel       2015     2015          1   2015 |
     |--------------------------------------------------------|
  6. |   cows      dork       2004     2006          3   2004 |
  7. |   cows      dork       2004     2006          3   2005 |
  8. |   cows      dork       2004     2006          3   2006 |
     +--------------------------------------------------------+

Ничего против tsset или tsfill, но для этого ничего не нужно.

0 голосов
/ 20 ноября 2018

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

clear

input strL A strL B begin_yr end_yr
asset  brown 2007 2010
basics caramel 2015 2015
cows dork 2004 2006
end

generate id = _n
expand 2

clonevar year = begin_yr
bysort id: replace year = end_yr[2] if _n == _N

drop if _n == 3

tsset id year
tsfill

foreach var in  A B begin_yr end_yr {
    bysort id: replace `var' = `var'[1]
}

list

     +--------------------------------------------------+
     |      A         B   begin_yr   end_yr   id   year |
     |--------------------------------------------------|
  1. |  asset     brown       2007     2010    1   2007 |
  2. |  asset     brown       2007     2010    1   2008 |
  3. |  asset     brown       2007     2010    1   2009 |
  4. |  asset     brown       2007     2010    1   2010 |
  5. | basics   caramel       2015     2015    2   2015 |
     |--------------------------------------------------|
  6. |   cows      dork       2004     2006    3   2004 |
  7. |   cows      dork       2004     2006    3   2005 |
  8. |   cows      dork       2004     2006    3   2006 |
     +--------------------------------------------------+
...