我的数据中的每个观察都呈现出一个遵循一些随机模式的玩家。变量move1
向上表示每个玩家处于活动状态的移动。我需要计算每个玩家活跃的次数:
数据看起来如下(_count
表示我想要生成的变量)。根据模拟,移动的数量也可能不同。
+------------+------------+-------+-------+-------+-------+-------+-------+--------+ | simulation | playerlist | move1 | move2 | move3 | move4 | move5 | move6 | _count | +------------+------------+-------+-------+-------+-------+-------+-------+--------+ | 1 | 1 | 1 | 1 | 1 | 2 | . | . | 3 | | 1 | 2 | 2 | 2 | 4 | 4 | . | . | 2 | | 2 | 3 | 1 | 2 | 3 | 3 | 3 | 3 | 4 | | 2 | 4 | 4 | 1 | 2 | 3 | 3 | 3 | 1 | +------------+------------+-------+-------+-------+-------+-------+-------+--------+
egen
与anycount()
结合使用不适用于此情况,因为value()
选项的参数不是常量整数。
我已尝试循环浏览每个观察并使用egen
行(见下文),但它使count
保持缺失(初始化)并且效率不高(我有50,000次观察) 。有没有办法在Stata中做到这一点?
gen _count =.
quietly forval i = 1/`=_N' {
egen temp = anycount(move*), values( `=`playerlist'[`i']')
replace _count = temp
drop temp
}
答案 0 :(得分:3)
您可以轻松地删除观察循环。此外,egen
仅用于方便,而不是速度。
gen _count = 0
quietly forval j = 1/6 {
replace _count = _count + (move`j' == playerlist)
}
或
gen _count = move1 == playerlist
quietly forval j = 2/6 {
replace _count = _count + (move`j' == playerlist)
}
即使您已决定使用egen
,循环也只需要超过playerlist
的不同值,而不是所有观察值。假设最大值是42
gen _count = 0
quietly forval k = 1/42 {
egen temp = anycount(move*), value(`k')
replace _count = _count + temp
drop temp
}
但对于你的问题,这仍然是一个糟糕的方法。 (我写了anycount()
的原文,所以我可以说为什么写的。)
另请参阅http://www.stata-journal.com/sjpdf.html?articlenum=pr0046以查看按行工作的内容。
P.S。您的代码包含错误。
根据最后观察中的计数的最后一个值,您在所有观察中replace
计数变量。
将值与本地宏playerlist
进行比较。您可能没有该名称的本地宏,因此宏被评估为空。结果是,您通过将move*
变量的每个值与观察数进行比较来结束。您打算使用变量名playerlist
,但单引号会强制进行宏解释。
对于记录,这修复了两个错误:
gen _count = .
quietly forval i = 1/`=_N' {
egen temp = anycount(move*), values(`= playerlist[`i']')
replace _count = temp in `i'
drop temp
}