使用相同的信息计算不同列的出现次数

时间:2018-05-08 06:28:35

标签: count stata

我有一个看起来像这样的数据集

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,S1S3是位置标识符,年份是指1999或2000.我想计算一个主题留在主题中的所有事件这两年的位置相同(使用Stata)。也就是说,对于主题1,该值为2,对于主题2,它是1,对于主题3,它是0,对于主题4,它是3,对于主题5,它是1.

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 |
     +----------------------------------+