@jfeigenbaum 给出了部分答案。
我看到的问题是您缺少一个标识相关子组的变量。这些子组似乎受test 的约束,取值A - G。但我可能错了。
我已将此变量包含在示例数据集中,并将其命名为missvar。我将这个变量强加到数据集中,相信它可以识别虽然在您的原始帖子中隐含但对您的分析很重要的组。
clear
set more off
*----- example data -----
input ///
id str1 test str30 test_date value missvar
1 A "02/06/2014 12:26" 11 1
1 B "02/06/2014 12:26" 23 1
1 C "02/06/2014 13:17" 43 1
1 D "02/06/2014 13:17" 65 1
1 E "02/06/2014 13:17" 34 1
1 F "02/06/2014 13:17" 64 1
1 A "05/06/2014 15:14" 234 2
1 B "05/06/2014 15:14" 646 2
1 C "05/06/2014 16:50" 44 2
1 E "05/06/2014 16:50" 55 2
2 E "05/06/2014 16:50" 443 1
2 F "05/06/2014 16:50" 22 1
2 G "05/06/2014 16:59" 445 1
2 B "05/06/2014 20:03" 66 2
2 C "05/06/2014 20:03" 77 2
2 D "05/06/2014 20:03" 88 2
2 E "05/06/2014 20:03" 44 2
2 F "05/06/2014 20:19" 33 2
2 G "05/06/2014 20:19" 22 2
end
gen double tdate = clock( test_date, "DM20Yhm")
format %tc tdate
drop test_date
list, sepby(id)
*----- what you want ? -----
reshape wide value, i(id missvar tdate) j(test) string
collapse (min) tdate value?, by(id missvar)
rename value* *
list
应该有某种以编程方式识别组的方法。依靠数据的原始排序顺序是一种方法,但它可能不是最安全的。这可能是唯一的方法,但只有你知道。
编辑
关于您的评论和“缺失”变量,创建它的一种方法是:
// one hour is 3600000 milliseconds
bysort id (tdate): gen batch = sum(tdate - tdate[_n-1] > 7200000)
对于您的示例数据,这会创建一个与我的missvar 相同的batch 变量。您还可以使用时间序列运算符。
让我强调您在展示示例数据时需要小心。它必须是真实代码的代表,否则您可能会得到不适合它的代码;这包括您没有注意到它的可能性,因为 Stata 没有给出错误。
例如,如果您有相同的test,并在两小时限制内应用于相同的id,那么您将丢失此代码(在collapse 中)的信息。 (这在您的示例数据中不是问题。)
编辑 2
针对在 cmets 中发现的另一个问题:
假设 第 1 个人有一个新的观察结果,他在两小时的限制内收到了重复测试,但在不同的时间:
1 A "02/06/2014 12:26" 11 1 // old observation
1 B "02/06/2014 12:26" 23 1
1 A "02/06/2014 12:35" 99 1 // new observation
1 C "02/06/2014 13:17" 43 1
1 D "02/06/2014 13:17" 65 1
1 E "02/06/2014 13:17" 34 1
1 F "02/06/2014 13:17" 64 1
1 A "05/06/2014 15:14" 234 2
1 B "05/06/2014 15:14" 646 2
1 C "05/06/2014 16:50" 44 2
1 E "05/06/2014 16:50" 55 2
测试A 应用于12:26 和12:35。 Reshape 对此没有问题,但 collapse 将丢弃信息,因为它在 id missvar 组中取最小值;请注意,对于变量valueA,新信息(99)将丢失(所有其他变量也会发生这种情况,但您明确表示要丢弃它)。在reshape 之后但在collapse 之前你会得到:
. list, sepby(id)
+--------------------------------------------------------------------------------------------------+
| id missvar tdate valueA valueB valueC valueD valueE valueF valueG |
|--------------------------------------------------------------------------------------------------|
1. | 1 1 02jun2014 12:26:00 11 23 . . . . . |
2. | 1 1 02jun2014 12:35:00 99 . . . . . . |
3. | 1 1 02jun2014 13:17:00 . . 43 65 34 64 . |
4. | 1 2 05jun2014 15:14:00 234 646 . . . . . |
5. | 1 2 05jun2014 16:50:00 . . 44 . 55 . . |
|--------------------------------------------------------------------------------------------------|
6. | 2 1 05jun2014 16:50:00 . . . . 443 22 . |
7. | 2 1 05jun2014 16:59:00 . . . . . . 445 |
8. | 2 2 05jun2014 20:03:00 . 66 77 88 44 . . |
9. | 2 2 05jun2014 20:19:00 . . . . . 33 22 |
+--------------------------------------------------------------------------------------------------+
运行完整的代码证实了我们刚才所说的:
. list, sepby(id)
+--------------------------------------------------------------------------+
| id missvar tdate A B C D E F G |
|--------------------------------------------------------------------------|
1. | 1 1 02jun2014 12:26:00 11 23 43 65 34 64 . |
2. | 1 2 05jun2014 15:14:00 234 646 44 . 55 . . |
|--------------------------------------------------------------------------|
3. | 2 1 05jun2014 16:50:00 . . . . 443 22 445 |
4. | 2 2 05jun2014 20:03:00 . 66 77 88 44 33 22 |
+--------------------------------------------------------------------------+
现在假设 第 1 个人有一个新的观察结果,他在两小时的限制内收到了重复测试,但同时:
1 A "02/06/2014 12:26" 11 1 // old observation
1 B "02/06/2014 12:26" 23 1
1 A "02/06/2014 12:26" 99 1 // new observation
1 C "02/06/2014 13:17" 43 1
1 D "02/06/2014 13:17" 65 1
1 E "02/06/2014 13:17" 34 1
1 F "02/06/2014 13:17" 64 1
1 A "05/06/2014 15:14" 234 2
1 B "05/06/2014 15:14" 646 2
1 C "05/06/2014 16:50" 44 2
1 E "05/06/2014 16:50" 55 2
那么reshape 将不起作用。 Stata 抱怨:
变量 test 的值在 id missvar tdate 中不是唯一的
并且有理由。错误在发出问题的信号时很明显。 (如果不清楚,请返回help reshape 并进行一些练习。)鉴于命令的功能,该请求毫无意义。
最后,请注意,检查某些东西是否有效相对容易:试试吧!在这种情况下,所需要的只是稍微修改示例数据。如有必要,请返回帮助文件和手册。