我有以下数据集
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
变量。如果在1
中person1_person2
出现person2_person1
,则需要time = 4
的值。例如,如果time = 6
和occurrence
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}}
答案 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=pr0029和http://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