我有一个可以按以下格式简化的数据集:
clear
input str9 Date ID VarA VarB
"12jan2010" 5 21 42
"12jan2010" 6 47 21
"15jan2010" 10 7 68
"17jan2010" 6 -5 -3
"19jan2010" 6 -1 -1
end
在数据集中,有Date,ID,VarA和VarB。每个ID代表一组唯一的交易。我想在Stata中collapse (sum) VarA VarB, by(Date)
。但是,我想保留每个ID号的第一次观察的日期。
基本上,我希望上面的数据集成为以下内容:
+--------------------------------+
| Date ID Var1 Var2 |
|--------------------------------|
| 12jan2010 5 21 42 |
| 12jan2010 6 41 17 |
| 15jan2010 10 7 68 |
+--------------------------------+
12jan2010 17jan2010和19jan2010具有相同的ID,因此我希望collapse (sum) Var1 Var2
获得这三个观察结果。我想保留12jan2010的日期,因为它是第一次观察的日期。其他两个观察结果被删除。
我知道可能首先按ID折叠,然后与原始数据集合并然后合并。我想知道是否有更简单的方法来完成这项工作。谢谢!
答案 0 :(得分:1)
collapse
允许您计算各种统计信息,因此您可以将字符串日期转换为数字日期,然后使用数字日期的最小值来获得第一次出现。
clear
input str9 Date ID VarA VarB
"12jan2010" 5 21 42
"12jan2010" 6 47 21
"15jan2010" 10 7 68
"17jan2010" 6 -5 -3
"19jan2010" 6 -1 -1
end
gen Date2 = date(Date, "DMY")
format Date2 %td
collapse (sum) VarA VarB (min) Date2 , by(ID)
order Date2, first
li
产生
+------------------------------+
| Date2 ID VarA VarB |
|------------------------------|
1. | 12jan2010 5 21 42 |
2. | 12jan2010 6 41 17 |
3. | 15jan2010 10 7 68 |
+------------------------------+
回复评论:您可以仅为VarA
所在的观察生成格式化日期。 0(并且没有丢失)。 (假设根据您的评论,VarA
& VarB
总是有相同的符号。)
// now assume ID 6 has an earliest date of 17jan2005 (obs.4)
// but you want to return your 'first date' as the
// first date where varA & varB are both positive
clear
input str9 Date ID VarA VarB
"12jan2010" 5 21 42
"12jan2010" 6 47 21
"15jan2010" 10 7 68
"17jan2005" 6 -5 -3
"19jan2010" 6 -1 -1
end
gen Date2 = date(Date, "DMY") if VarA > 0 & !missing(VarA)
format Date2 %td
collapse (sum) VarA VarB (min) Date2 , by(ID)
order Date2, first
li
产生
+------------------------------+
| Date2 ID VarA VarB |
|------------------------------|
1. | 12jan2010 5 21 42 |
2. | 12jan2010 6 41 17 |
3. | 15jan2010 10 7 68 |
+------------------------------+