0

在 Stata 中,我有在一个项目中一起工作的人的这些数据。每一行都是一个项目,有 person_1 到 person_20 列,如果名称在该列中,则表示该人在该行中从事该项目。一个组可以是 1 人、2 人、...、20 人。对于每种可能性,我都有一个二进制变量(是 = 1):1 组(G1),G2,...,G11。然后我使用此代码进行分组(以 4 人组为例):

project_group = person_1 + "/" + person_2 + "/" + person_3 + "/" + person_4 if G4 == 1
This yields: Tom/Joe/Mike/Sally

我有三个问题:1)有没有更有效的方法来进行分组。例如,代码只查看一个项目(一行),计算那里有多少人(有多少字段不为空),然后创建一个唯一的组名,每个人的名字用“/”分隔。我对我创建的代码很好,但我的数据集的大小会改变,更高效的代码可能是最好的

2)从我的示例中,我如何将 Joe/Tom/Mike/Sa​​lly 或 Sally/Joe/Mike/Time 视为同一组。我希望所有组,无论大小,按字母顺序列出每个人。在我的示例中,无论实际排列如何,列表都是 Joe/Mike/Sa​​lly/Tom。

3)我如何根据第一人称使一个组独一无二(如果他们是项目负责人,他们就是列出的名字)。所以 Joe/Tom/Mike 和 Joe/Mike/Tom 是同一个组,但 Tom/Joe/Mike 和 Mike/Tom/Joe 不是。

感谢您的帮助和建议

4

2 回答 2

0

1)有没有更有效的方法来进行分组。

我不确定我是否理解您当前的安排有什么问题,这看起来很干净且易于阅读。

2)从我的示例中,我如何将 Joe/Tom/Mike/Sa​​lly 或 Sally/Joe/Mike/Time 视为同一组。

我假设您在最后一个字符串中指的是汤姆而不是时间。

egen team_size = anycount(person_1-person_20), v(1)
gen team_leader = .
if team_size > 0 replace team_leader = person_1
gen team_structure = 0
replace team_structure = team_structure + regexm(project_group,"Joe")
replace team_structure = team_structure + regexm(project_group,"Tom")*10
replace team_structure = team_structure + regexm(project_group,"Mike")*100
replace team_structure = team_structure + regexm(project_group,"Sally")*1000

team_structure是一个 $k$ 长度的二进制文件,用于对 $k$ 成员的团队成员身份进行编码,无论他们在project_group字符串中显示的顺序如何。如果您有很多成员,这将是代码昂贵,但很容易创建。

3)我如何根据第一人称使一个组独一无二(如果他们是项目负责人,他们就是列出的名字)。所以 Joe/Tom/Mike 和 Joe/Mike/Tom 是同一个组,但 Tom/Joe/Mike 和 Mike/Tom/Joe 不是。

小建议:为每个可能的成员 ( ) 添加一个因子,并将其分配给上面创建的变量encode的小数。team_structure示例:1011.1 是由 Joe 领导的组 Joe/Mike/Sa​​lly,1011.4 是由 Sally 领导的同一组,依此类推。

于 2012-10-22T00:23:58.410 回答
0

我重新安排了我的方法,使其更加清晰。你提到你不能重新编码你的变量,但我不确定是否有办法解决这个问题(我认为这里的任何解决方案都可以显式或隐式地重新编码)。当然,您需要始终将“4”替换为“20”。

* generate some projects and members
clear
set obs 5
generate int project = _n
generate person_1 = "Tom"
generate person_2 = "Dick" if (_n >= 3)
generate person_3 = "Harry" if (_n >=5)
replace person_1 = "Jane" if inlist(_n, 2, 4)
tempfile orig
save `orig'

* reshape to long
reshape long person_, i(project) string
drop _j
drop if missing(person)
sort project person
egen id = group(person)
drop if missing(id)
reshape wide person, i(project) j(id)

* recode to allow easier group identification
forvalues i = 1/4 {
    levelsof person_`i', local(name) clean
    generate byte d_person_`i' = cond(missing(person_`i'), 0, 1)
    label define d_person_`i'_lbl 1 "`name'" 0 ""
    label values d_person_`i' d_person_`i'_lbl
}

* determine number of workers on project
egen gp_size = rowtotal(d_person_*)

* unique id for each group composition
generate int id = 0
forvalues i = 1/4 {
    local two_i = 2^(`i' - 1)
    replace id = id + d_person_`i' * `two_i'
}

* group members
generate str mbrs = ""
forvalues i = 1/4 {
    local name: label d_person_`i'_lbl 1
    replace mbrs = mbrs + "/" + "`name'" if (d_person_`i' == 1)
}   

* there's always a leading "/" to remove with this approach
replace m = substr(m, 2, .)

* merge back your orig data
merge 1:1 project using `orig', nogenerate replace update

这产生:

. list

     +---------------------------------------------------------------------------------------------------------------------------------+
     | project   person_1   person_2   person_3   person_4   d_pers~1   d_pers~2   d_pers~3   d_pers~4   gp_size   id             mbrs |
     |---------------------------------------------------------------------------------------------------------------------------------|
  1. |       1        Tom                              Tom                                         Tom         1    8              Tom |
  2. |       2       Jane                  Jane                                        Jane                    1    4             Jane |
  3. |       3        Tom       Dick                   Tom       Dick                              Tom         2    9         Dick/Tom |
  4. |       4       Jane       Dick       Jane                  Dick                  Jane                    2    5        Dick/Jane |
  5. |       5        Tom       Dick      Harry        Tom       Dick      Harry                   Tom         3   11   Dick/Harry/Tom |
     +---------------------------------------------------------------------------------------------------------------------------------+
于 2012-10-20T16:49:01.263 回答