我想选择由一个或多个分类变量确定的每个数据子集中的最后一行。
背景。对于我的数据集中的每张票,我有一个ticketid
和多个交易(销售,退款,促销,退款,销售......)。我只对保持以“促销”结尾的系列感兴趣。
我的第一步是放弃ticketid
以获得均匀匹配的销售和退款:
duplicates tag ticketid, gen(mult)
by ticketid: egen count_sale = total(transtatus == "Sale")
by ticketid: egen count_ref = total(transtatus == "Refund")
drop if mult & count_sale == count_ref
现在,我想在count_sale = count_ref + 1
sort ticketid time
preserve
** some collapse command
save "temp_terminal_sales.dta"
restore
append using "temp_terminal_sales.dta"
我无法弄清楚如何(如果有的话)在这里使用collapse
。我想我可能只需要keep if mult
,用by ticketid: gen last = _n == _N
和keep if last
标记最后一行......?似乎崩溃应该有效。这是(错误的)语法,对我来说似乎很直观:
collapse (last), by(ticketid)
collapse (last) *, by(ticketid)
这些不起作用,因为(i)需要varlist
,以及(ii)by
变量不能出现在varlist
中。
示例数据:
ticketid time myvar transtatus
1 1 2 "Sale"
1 2 2 "Refund"
2 1 2 "Sale"
3 1 2 "Sale"
3 2 2 "Refund"
3 3 2 "Sale"
3 4 2 "Refund"
4 1 2 "Sale"
4 2 2 "Refund"
4 3 2 "Sale"
期望的结果:
ticketid time myvar transtatus
2 1 2 "Sale"
4 3 2 "Sale"
答案 0 :(得分:3)
保留最后一组的最简单的通用方法如下。对于具体示例,我假设具有标识符id
和时间变量time
的面板数据:
bysort id (time): keep if _n == _N
概括是
bysort <variables defining groups> (<variable defining order first ... last>): keep if _n == _N
许多Stata命令支持in
限定符,但在这里我们需要if
,语法在by:
观察号_n
和_N
的支持下至关重要观察次数by:
由_n == 1
定义的组内确定。因此_n == _N
标识第一个,drop if _n < _N
标识每个组中的最后一个观察。
collapse
是双重命令。
您在问题中提到了这种方法,但创建指标变量的中间步骤是不必要的。
对于gen anything = 1
来说,解决方法可能仅仅是使用其他变量,或者甚至为by:
中的目的创建一个变量。但我总是将by:
用于你的目的。
在http://www.stata-journal.com/article.html?article=pr0004 by
上有一个话语教程,使用{{1}}搜索 Stata期刊档案作为关键字会显示更多应用。
答案 1 :(得分:1)
@NickCox已经提供了一般答案。既然您已经提供了示例数据,我发布了一个可重现的示例,其中包含几种语法:
clear all
set more off
input ///
ticketid time myvar str10 transtatus
1 1 2 "Sale"
1 2 2 "Refund"
2 1 2 "Sale"
3 1 2 "Sale"
3 2 2 "Refund"
3 3 2 "Sale"
3 4 2 "Refund"
4 1 2 "Sale"
4 2 2 "Refund"
4 3 2 "Sale"
end
list, sepby(ticketid)
*-----
* Method 1
bysort ticketid (time): keep if transtatus[_N] == "Sale" // keep subsets
by ticketid: keep if _n == _N // keep last observation of subsets
list
*-----
* Method 2
// list of all variables except ticketid
unab allvars: _all
local exclvar ticketid
local mycvars: list allvars - exclvar
bysort ticketid (time): keep if transtatus[_N] == "Sale" // keep subsets
collapse (last) `mycvars', by(ticketid) // keep last observation of subsets
list
*-----
*Method 3
bysort ticketid (time): keep if transtatus[_N] == "Sale" & _n == _N
list
(请记住重新加载每种方法的数据。)
还要考虑标记,然后使用if
运行以下估算命令。例如,regress ... if ...