我有此数据:
id test test_date value
1 A 02/06/2014 12:26 11
1 B 02/06/2014 12:26 23
1 C 02/06/2014 13:17 43
1 D 02/06/2014 13:17 65
1 E 02/06/2014 13:17 34
1 F 02/06/2014 13:17 64
1 A 05/06/2014 15:14 234
1 B 05/06/2014 15:14 646
1 C 05/06/2014 16:50 44
1 E 05/06/2014 16:50 55
2 E 05/06/2014 16:50 443
2 F 05/06/2014 16:50 22
2 G 05/06/2014 16:59 445
2 B 05/06/2014 20:03 66
2 C 05/06/2014 20:03 77
2 D 05/06/2014 20:03 88
2 E 05/06/2014 20:03 44
2 F 05/06/2014 20:19 33
2 G 05/06/2014 20:19 22
我想将此数据转换为如下所示的宽格式:
id date A B C D E F G
1 02/06/2014 12:26 11 23 43 65 34 64 .
1 05/06/2014 15:14 234 646 44 . 55 . .
2 05/06/2014 16:50 . . . . 443 22 445
2 05/06/2014 20:03 . 66 77 88 44 33 22
我reshape
在Stata中使用命令,但未产生所需的结果:
reshape wide test_date value, i(id) j(test) string
任何想法如何做到这一点?
更新:您是对的,我们需要此missvar。我尝试通过编程来创建它,但是失败了。假设在测试日期的2小时内,该批次将视为相同。我们只有7个测试(A,B,C,D,E,F,G)。首先,我尝试找出时差;
bysort id: gen diff_bd = (test_date[_n] - test_date[_n-1])/(1000*60*60)
bysort id: generate missvar = _n if diff_bd <= 2
@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)
对于您的示例数据,这将创建一个batch
与my相同的变量missvar
。您还可以使用时间序列运算符。
让我强调,在介绍示例数据时,您需要格外小心。它必须代表真实的代码,否则您可能会得到不适合它的代码。其中包括您可能没有注意到它的原因,因为Stata没有给出任何错误。
例如,如果您在两个小时的限制内将相同的test
应用于相同id
的对象,则使用此代码(在中collapse
)将丢失信息。(这不是示例数据中的问题。)
针对评论中发现的另一个问题:
假设对人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
将无法正常工作。斯塔塔抱怨:
变量test的值在id missvar tdate中不是唯一的
并有理由。该错误在发出问题信号时很明显。(如果不清楚,请返回help reshape
并进行一些练习。)鉴于命令的功能,该请求没有任何意义。
最后,请注意,检查某些功能是否相对工作相对容易:只需尝试一下即可!在这种情况下,所需要做的就是稍微修改示例数据。如有必要,请返回帮助文件和手册。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句