将原始数据转换为长格式的有效方法?

问题描述 投票:0回答:1

我对Stata中的数据处理有一个初学者的问题。从Excel文件中,我导入的数据既不长也不宽(我不确定要称呼什么),例如采用以下格式(“。”代表空格):

Identifyer  Purchased in Year   Sold in Year
A   2017    .
B   .   .
C   2016    2019
C   2018    .
D   2018    2019
D   2018    .

我的目标是获取以下长格式的数据,即反映每年的计数

Identifyer  Year    Inventory
A   2016    0
A   2017    1
A   2018    1
A   2019    1
B   2016    0
B   2017    0
B   2018    0
B   2019    0
C   2016    0
C   2017    0
C   2018    1
C   2019    1
D   2016    0
D   2017    0
D   2018    2
D   2019    1

我最初的方法是先将其转换为宽格式,即每个标识符仅包含一行,然后为2016-2018年之间的年份添加列。然后将此格式转换为所需的长格式。但是,这似乎是很多步骤。有没有更短,更有效的方法来执行此操作,因为我将针对更大的数据集执行此操作,并且还想学习如何高效地执行操作。

count stata long-integer
1个回答
0
投票

这需要几个小技巧。最关键的是reshape longfillin

clear
input str1 Identifier  Purchased  Sold 
A   2017    .
B   .   .
C   2016    2019
C   2018    .
D   2018    2019
D   2018    .
end 

gen long id = _n 
rename (Purchased Sold) year= 
reshape long year, i(id) j(Event) string 
drop id 

fillin Id year 
drop _fillin 
drop if missing(year) 

bysort Id (year Event) : gen inventory = sum((Event == "Purchased") - (Event == "Sold")) 
drop Event 
bysort Id year : keep if _n == _N 
list, sepby(Id) 

     +----------------------------+
     | Identi~r   year   invent~y |
     |----------------------------|
  1. |        A   2016          0 |
  2. |        A   2017          1 |
  3. |        A   2018          1 |
  4. |        A   2019          1 |
     |----------------------------|
  5. |        B   2016          0 |
  6. |        B   2017          0 |
  7. |        B   2018          0 |
  8. |        B   2019          0 |
     |----------------------------|
  9. |        C   2016          1 |
 10. |        C   2017          1 |
 11. |        C   2018          2 |
 12. |        C   2019          1 |
     |----------------------------|
 13. |        D   2016          0 |
 14. |        D   2017          0 |
 15. |        D   2018          2 |
 16. |        D   2019          1 |
     +----------------------------+
© www.soinside.com 2019 - 2024. All rights reserved.