找到之前发生的值之间的匹配

时间:2013-11-20 22:50:44

标签: loops stata

我有以下数据集

time  person1_person_2   person2_person1   occurrence   cell_count
  1        A_B                B_A               0           1
  2        A_C                C_A               0           2
  3        B_A                A_B               1           3
  4        E_A                A_E               0           4
  5        C_A                A_C               1           5
  6        E_A                A_E               0           6
  7        A_B                B_A               1           7

在Stata中,我正在尝试创建occurrence变量。如果在1person1_person2出现person2_person1,则需要time = 4的值。例如,如果time = 6occurrence 0取值E_A,因为person2_person1字段gen occurrence = 0 local i = cell_count-1 foreach j in `i' { replace occurrence = 1 if person1_person2 == person2_person1[_n-`j'] } 尚未出现。{/ p >

我试过了,没有运气:

{{1}}

2 个答案:

答案 0 :(得分:3)

正如您所猜测的,一种方法是使用循环。

clear 
input time  str3 person1_person2   str3 person2_person1   
1        A_B                B_A               
2        A_C                C_A               
3        B_A                A_B               
4        E_A                A_E               
5        C_A                A_C               
6        E_A                A_E               
7        A_B                B_A               
end 

gen occurrence = 0 

qui forval i = 2/`=_N' { 
    local I = `i' - 1 
    count if person2_person1 == person1_person2[`i'] in 1/`I' 
    if r(N) replace occurrence = 1 in `i' 
} 

if r(N)相当于if r(N) > 0,因为r(N)为真(非零)且正数为1且相同,因为计数永远不会为负数。 r(N)是由count留在内存中的结果。参见例如关于count的教程http://www.stata-journal.com/sjpdf.html?articlenum=pr0029http://www.stata-journal.com/sjpdf.html?articlenum=pr0033

您的代码包含

local i = cell_count-1
foreach j in `i' {

第一个将被评估为

local i = cell_count[1] - 1 

出现为0,所以你的循环只是

foreach j in 0 { 

等单行

replace occurrence = 1 if person1_person2 == person2_person1[_n]

replace occurrence = 1 if person1_person2 == person2_person1

测试同时平等。这不是你需要的运气,而是逻辑!

答案 1 :(得分:0)

不可否认,并不像@Nick Cox的解决方案那么简单,但总体思路相当简单:记录p2_p1每个值首次出现的时间,然后与{{1}的当前值的时间进行比较}。

注意这里没有明确的循环,这是我正在探索的东西。它并不一定意味着它更有效率。

p1_p2