0

Stataには、プロジェクトで一緒に働いた人々のこのデータがあります。各行はプロジェクトであり、person_1からperson_20までの列があり、名前がその列にある場合、その人がその行でそのプロジェクトに取り組んだことを意味します。グループは1人、2人、...、20人にすることができます。可能性ごとにバイナリ変数(yes = 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

私は3つの質問があります:1)グループ化を行うためのより効率的な方法はありますか?たとえば、プロジェクト全体(行)を調べ、そこにいる人の数(空でないフィールドの数)を数え、「/」で区切られた各人の名前である一意のグループ名を作成するコード。作成したコードは問題ありませんが、データセットのサイズが変更されるため、より効率的なコードがおそらく最適です。

2)私の例から、Joe / Tom / Mike/Sa​​llyまたはSally/Joe / Mike/Timeを同じグループとしてどのように扱うことができますか。サイズに関係なく、すべてのグループが各人をアルファベット順にリストすることをお勧めします。私の例では、実際の順列に関係なく、リストはJoe / Mike / Sally/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 を同じグループとしてどのように扱うことができますか?

最後の文字列では、Time ではなく Tom を意味していたと思います。

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$ の長さのバイナリで、project_group文字列に表示される順序に関係なく、$k$ メンバーのチーム メンバーシップをコード化します。多くのメンバーがいる場合、これはコードのコストが高くなりますが、作成は非常に簡単です。

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 に答える