1

我的数据中的每一个观察结果都代表了一个遵循某种随机模式的玩家。up变量move1表示每个玩家活跃的动作。我需要计算每个玩家活跃的次数:

数据如下所示(_count代表我想生成的变量)。移动的数量也可以根据模拟而不同。

+------------+------------+-------+--------+------- +-------+-------+--------+--------+
| 模拟 | 播放列表 | 移动1 | 移动2 | 移动3 | 移动4 | 移动5 | 移动6 | _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在这种情况下组合 withanycount()不适用,因为该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
}
4

1 回答 1

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以查看按行工作的评论。

PS您的代码包含错误。

您在所有replace观察中的计数变量都是为最后一次观察中的计数计算的最后一个值。

值与本地宏进行比较playerlist。您可能没有该名称的本地宏,因此该宏被评估为空。结果是您通过将move*变量的每个值与观察数字进行比较来结束。您打算使用变量 name playerlist,但单引号强制宏解释。

作为记录,这修复了两个错误:

  gen _count = .  
  quietly forval i = 1/`=_N' {  
      egen temp = anycount(move*), values(`= playerlist[`i']')
      replace _count = temp in `i' 
      drop temp
  }
于 2013-08-31T07:31:39.647 回答