我有一个看起来像这样的数据集
ID S1 S2 S3 year
1 1 2 1999
1 1 2 2000
2 1 1999
2 1 2000
3 1 1999
3 2 2000
4 1 2 3 1999
4 3 1 2 2000
5 1 2 1999
5 1 3 2000
其中第一列是主题ID,S1
到S3
是位置标识符,年份是指1999或2000.我想计算一个主题留在主题中的所有事件这两年的位置相同(使用Stata)。也就是说,对于主题1,该值为2,对于主题2,它是1,对于主题3,它是0,对于主题4,它是3,对于主题5,它是1.
答案 0 :(得分:2)
我认为你的空白真是数字缺失。如果S1 S2 S3
实际上是字符串并且空格是空字符串,那么这也应该有用。 1 2 3和3 1 2等效的示例排除了在循环中仅计算S1 S2 S3
上的相似性的各种更简单的解决方案。
clear
input ID S1 S2 S3 year
1 1 2 . 1999
1 1 2 . 2000
2 1 . . 1999
2 1 . . 2000
3 1 . . 1999
3 2 . . 2000
4 1 2 3 1999
4 3 1 2 2000
5 1 2 . 1999
5 1 3 . 2000
end
reshape long S, i(ID year) j(which)
bysort ID (S) : gen count = sum(S == S[_n-1] & !missing(S))
by ID: replace count = count[_N]
reshape wide S, i(ID year) j(which)
list, sepby(ID)
+----------------------------------+
| ID year S1 S2 S3 count |
|----------------------------------|
1. | 1 1999 1 2 . 2 |
2. | 1 2000 1 2 . 2 |
|----------------------------------|
3. | 2 1999 1 . . 1 |
4. | 2 2000 1 . . 1 |
|----------------------------------|
5. | 3 1999 1 . . 0 |
6. | 3 2000 2 . . 0 |
|----------------------------------|
7. | 4 1999 1 2 3 3 |
8. | 4 2000 3 1 2 3 |
|----------------------------------|
9. | 5 1999 1 2 . 1 |
10. | 5 2000 1 3 . 1 |
+----------------------------------+