我对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年之间的年份添加列。然后将此格式转换为所需的长格式。但是,这似乎是很多步骤。有没有更短,更有效的方法来执行此操作,因为我将针对更大的数据集执行此操作,并且还想学习如何高效地执行操作。
这需要几个小技巧。最关键的是reshape long
和fillin
。
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 |
+----------------------------+