选择最后一行按"折叠(最后)..."句法

时间:2014-10-06 14:18:37

标签: stata

我想选择由一个或多个分类变量确定的每个数据子集中的最后一行。


背景。对于我的数据集中的每张票,我有一个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 == _Nkeep 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"

2 个答案:

答案 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 ...