首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >年月日换算

年月日换算
EN

Stack Overflow用户
提问于 2017-04-10 01:12:50
回答 1查看 64关注 0票数 0

我有一个宽格式的数据集,其中包含从Q1 1996Q4 2016的事件季度计数。

每个季度的可变名称如下:

  • Q1 = yyyy0101_yyyy0401
  • Q2 = yyyy0401_yyyy0701
  • Q3 = yyyy0701_yyyy1001
  • Q4 = yyyy1001_yyyy0101

我有一个宏可以像这样转换它们:

代码语言:javascript
复制
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

代码语言:javascript
复制
reshape long count, i(xvars) j(year)

现在我也想做同样的事,但每季度一次。

什么是宏来执行完全相同的过程,但捕获的计数之和在年度季度?如果我想做半年呢?

EN

回答 1

Stack Overflow用户

发布于 2017-04-10 12:03:22

在试图理解这一点时,我首先注意到(无论是迂腐的),您的代码不是Stata意义上的宏: SAS用户?)第二(更有建设性的),您的代码可以压缩为

代码语言:javascript
复制
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
}

假定本地宏、ix运行在相同的值上。(这些都是Stata意义上的宏。)但我不会从那里开始。

正如您所说的,数据是宽格式的(我更喜欢用布局这个术语来减轻重载),所以主要的工作不是写循环,而是把reshape写到long。这个例子包含了一些猜测,并展示了一些技巧。如果没有可以使用的数据示例,我首先创建一个沙箱:

代码语言:javascript
复制
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或同一数据集的不同版本。如何列出,列出或以其他方式处理重复将是不同的问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43313657

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档