生成范围之间的列的值

时间:2018-11-20 18:54:32

标签: stata stata-macros

我有以下数据集

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>

</head>

<body>

  {{{body}}}

  <script src="/JS/api.js"></script>
  <script src="/JS/fetchData.js"></script>

</body>

</html>

我希望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 的其余部分?

2 个答案:

答案 0 :(得分:3)

这是@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 |
     +--------------------------------------------------------+

无需反对tssettsfill,但也不需要。

答案 1 :(得分:2)

以下对我有用:

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