我有一个宽格式的数据集,其中包含从Q1
1996
到Q4
2016
的事件季度计数。
每个季度的可变名称如下:
yyyy0101_yyyy0401
yyyy0401_yyyy0701
yyyy0701_yyyy1001
yyyy1001_yyyy0101
我有一个宏可以像这样转换它们:
local i = 1996
forvalues x = 1996/2016 {
local i = `i'+1
gen count`x' = event_`x'0101_`x'0401 + event_`x'0401_`x'0701 +
event_`x'0701_`x'1001 + event_`x'1001_`i'0101
}
然后,我按年将数据折叠成一个长格式的单变量count
:
reshape long count, i(xvars) j(year)
现在我也想做同样的事,但每季度一次。
什么是宏来执行完全相同的过程,但捕获的计数之和在年度季度?如果我想做半年呢?
发布于 2017-04-10 04:03:22
在试图理解这一点时,我首先注意到(无论是迂腐的),您的代码不是Stata意义上的宏: SAS用户?)第二(更有建设性的),您的代码可以压缩为
forvalues x = 1996/2016 {
gen count`x' = event_`x'0101_`x'0401 + event_`x'0401_`x'0701 + event_`x'0701_`x'1001 + event_`x'1001_`x'0101
}
假定本地宏、i
和x
运行在相同的值上。(这些都是Stata意义上的宏。)但我不会从那里开始。
正如您所说的,数据是宽格式的(我更喜欢用布局这个术语来减轻重载),所以主要的工作不是写循环,而是把reshape
写到long。这个例子包含了一些猜测,并展示了一些技巧。如果没有可以使用的数据示例,我首先创建一个沙箱:
clear
set obs 21
local y = 1
foreach v in yyyy0101_yyyy0401 yyyy0401_yyyy0701 yyyy0701_yyyy1001 yyyy1001_yyyy0101 {
gen `v' = `++y'
}
gen year = 1995 + _n
rename (yyyy*) (count#), addnumber
reshape long count, i(year) j(quarter)
gen qdate = yq(y, q)
egen ycount = total(count), by(year)
egen qcount = total(count), by(quarter)
gen half = cond(inlist(quarter, 1, 2), 1, 2)
egen hcount = total(count), by(year half)
list if year < 1998, sepby(year)
+------------------------------------------------------------------+
| year quarter count qdate ycount qcount half hcount |
|------------------------------------------------------------------|
1. | 1996 1 2 144 14 42 1 5 |
2. | 1996 2 3 145 14 63 1 5 |
3. | 1996 3 4 146 14 84 2 9 |
4. | 1996 4 5 147 14 105 2 9 |
|------------------------------------------------------------------|
5. | 1997 1 2 148 14 42 1 5 |
6. | 1997 2 3 149 14 63 1 5 |
7. | 1997 3 4 150 14 84 2 9 |
8. | 1997 4 5 151 14 105 2 9 |
+------------------------------------------------------------------+
这与您已经使用reshape long
时所做的工作有何不同?主要是为了强调,无论你想要什么,在不同的时间尺度上,都可以在适当的地方产生。您不需要重复的collapse
或同一数据集的不同版本。如何列出,列出或以其他方式处理重复将是不同的问题。
https://stackoverflow.com/questions/43313657
复制相似问题