2017-12-29 40 views
0

ラウンド、ステーション、プレーヤー(男性と女性)の4つの異なる変数のすべての組み合わせを使用するrスクリプトを作成しています。以下は、データセットの私のdputバージョンです:繰り返しのないラウンドで4人のプレイヤーを割り当てる

3ラウンド、3つの駅、6男性:次がある。このデータセットでは

 Round Station Partner1 Partner2 
55 round1 station1 male1 female2 
109 round1 station1 male1 female3 
163 round1 station1 male1 female4 
217 round1 station1 male1 female5 
271 round1 station1 male1 female6 
10 round1 station1 male2 female1 
118 round1 station1 male2 female3 
172 round1 station1 male2 female4 
226 round1 station1 male2 female5 
280 round1 station1 male2 female6 

以下
structure(list(x = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L), .Label = c("round1", "round2", "round3" 
), class = "factor"), x.x = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("station1", "station2", 
"station3"), class = "factor"), x.y = structure(c(1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 
4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 
5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 
5L, 5L, 6L, 6L, 6L, 6L, 6L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 
6L, 6L, 6L, 6L, 6L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 
3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 
6L, 6L, 6L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 
6L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 1L, 
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 
4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L, 1L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 
4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L), .Label = c("male1", 
"male2", "male3", "male4", "male5", "male6"), class = "factor"), 
y = structure(c(2L, 3L, 4L, 5L, 6L, 1L, 3L, 4L, 5L, 6L, 1L, 
2L, 4L, 5L, 6L, 1L, 2L, 3L, 5L, 6L, 1L, 2L, 3L, 4L, 6L, 1L, 
2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 6L, 1L, 3L, 4L, 5L, 6L, 1L, 
2L, 4L, 5L, 6L, 1L, 2L, 3L, 5L, 6L, 1L, 2L, 3L, 4L, 6L, 1L, 
2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 6L, 1L, 3L, 4L, 5L, 6L, 1L, 
2L, 4L, 5L, 6L, 1L, 2L, 3L, 5L, 6L, 1L, 2L, 3L, 4L, 6L, 1L, 
2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 6L, 1L, 3L, 4L, 5L, 6L, 1L, 
2L, 4L, 5L, 6L, 1L, 2L, 3L, 5L, 6L, 1L, 2L, 3L, 4L, 6L, 1L, 
2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 6L, 1L, 3L, 4L, 5L, 6L, 1L, 
2L, 4L, 5L, 6L, 1L, 2L, 3L, 5L, 6L, 1L, 2L, 3L, 4L, 6L, 1L, 
2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 6L, 1L, 3L, 4L, 5L, 6L, 1L, 
2L, 4L, 5L, 6L, 1L, 2L, 3L, 5L, 6L, 1L, 2L, 3L, 4L, 6L, 1L, 
2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 6L, 1L, 3L, 4L, 5L, 6L, 1L, 
2L, 4L, 5L, 6L, 1L, 2L, 3L, 5L, 6L, 1L, 2L, 3L, 4L, 6L, 1L, 
2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 6L, 1L, 3L, 4L, 5L, 6L, 1L, 
2L, 4L, 5L, 6L, 1L, 2L, 3L, 5L, 6L, 1L, 2L, 3L, 4L, 6L, 1L, 
2L, 3L, 4L, 5L, 2L, 3L, 4L, 5L, 6L, 1L, 3L, 4L, 5L, 6L, 1L, 
2L, 4L, 5L, 6L, 1L, 2L, 3L, 5L, 6L, 1L, 2L, 3L, 4L, 6L, 1L, 
2L, 3L, 4L, 5L), .Label = c("female1", "female2", "female3", 
"female4", "female5", "female6"), class = "factor")), .Names = c("x", 
"x.x", "x.y", "y"), row.names = c(55L, 109L, 163L, 217L, 271L, 
10L, 118L, 172L, 226L, 280L, 19L, 73L, 181L, 235L, 289L, 28L, 
82L, 136L, 244L, 298L, 37L, 91L, 145L, 199L, 307L, 46L, 100L, 
154L, 208L, 262L, 58L, 112L, 166L, 220L, 274L, 13L, 121L, 175L, 
229L, 283L, 22L, 76L, 184L, 238L, 292L, 31L, 85L, 139L, 247L, 
301L, 40L, 94L, 148L, 202L, 310L, 49L, 103L, 157L, 211L, 265L, 
61L, 115L, 169L, 223L, 277L, 16L, 124L, 178L, 232L, 286L, 25L, 
79L, 187L, 241L, 295L, 34L, 88L, 142L, 250L, 304L, 43L, 97L, 
151L, 205L, 313L, 52L, 106L, 160L, 214L, 268L, 56L, 110L, 164L, 
218L, 272L, 11L, 119L, 173L, 227L, 281L, 20L, 74L, 182L, 236L, 
290L, 29L, 83L, 137L, 245L, 299L, 38L, 92L, 146L, 200L, 308L, 
47L, 101L, 155L, 209L, 263L, 59L, 113L, 167L, 221L, 275L, 14L, 
122L, 176L, 230L, 284L, 23L, 77L, 185L, 239L, 293L, 32L, 86L, 
140L, 248L, 302L, 41L, 95L, 149L, 203L, 311L, 50L, 104L, 158L, 
212L, 266L, 62L, 116L, 170L, 224L, 278L, 17L, 125L, 179L, 233L, 
287L, 26L, 80L, 188L, 242L, 296L, 35L, 89L, 143L, 251L, 305L, 
44L, 98L, 152L, 206L, 314L, 53L, 107L, 161L, 215L, 269L, 57L, 
111L, 165L, 219L, 273L, 12L, 120L, 174L, 228L, 282L, 21L, 75L, 
183L, 237L, 291L, 30L, 84L, 138L, 246L, 300L, 39L, 93L, 147L, 
201L, 309L, 48L, 102L, 156L, 210L, 264L, 60L, 114L, 168L, 222L, 
276L, 15L, 123L, 177L, 231L, 285L, 24L, 78L, 186L, 240L, 294L, 
33L, 87L, 141L, 249L, 303L, 42L, 96L, 150L, 204L, 312L, 51L, 
105L, 159L, 213L, 267L, 63L, 117L, 171L, 225L, 279L, 18L, 126L, 
180L, 234L, 288L, 27L, 81L, 189L, 243L, 297L, 36L, 90L, 144L, 
252L, 306L, 45L, 99L, 153L, 207L, 315L, 54L, 108L, 162L, 216L, 
270L), class = "data.frame")` 

は、最初の10行です、6女性

私は、次の操作を行うにはどうすればよい:

1)何人もであってはなりません同じステーションは二回

2)何人も何人も、二回

4同じ人と提携すべきではない)を2回

3同じラウンドであってはならない)各ステーション2男性と女性2名

が必要です

5)理想的には、各人は前回のラウンドに参加していない人と一緒にいなければなりません。

6)最後に同じ番号を持つプレーヤー(male1、female1)

を提携するべきではありませんので、最終的な出力は、ラウンドの1のために次のようになります。

 Round Station Partner1 Partner2 
55 round1 station1 male1 female5 
109 round1 station1 male3 female4 
163 round1 station2 male2 female3 
217 round1 station2 male4 female1 
271 round1 station3 male5 female6 
10 round1 station3 male6 female2 

ラウンド2の場合、3つのステーションはすべて存在するはずですが、オスとメスのパートナーは変更する必要があり、上記のルールに従う必要があります。

さらに、追加のステーションを追加せずに数学的に不可能な場合はお知らせください。

助けがあれば助かります!

+0

次のラウンドのために各男性ステーションに1を加え、次のラウンド(mod 3)のために各女性ステーションに1を引いてください。男性番号=女性番号の状況になっている場合は、同じ駅の2人の女性が切り替わります。 – Gregor

+0

入力していただきありがとうございますGregor!このロジックは駅でも同様に動作するのだろうか? –

+0

私はあなたの質問を理解していません。あなたのような有効な開始ラウンドに基づいて次の2ラウンドを生成します。 – Gregor

答えて

1

ここには簡単な解決策があります。それは厳しい要件ではないように思われます(厳密なルールとして可能ではないと私は考えていません)。

この関数は、有効な第1ラウンドを入力とし、2回目のラウンド(および3番目のラウンド)を有効に構成します。

データを、文字列よりも操作がはるかに簡単な番号に変更しました。厳密に言えば、機能が動作するには、Partner列(名前がMaleFemaleに変更)のみが必要です。

# data 
r1 = read.table(text = "  Round Station Partner1 Partner2 
55 round1 station1 male1 female5 
109 round1 station1 male3 female4 
163 round1 station2 male2 female3 
217 round1 station2 male4 female1 
271 round1 station3 male5 female6 
10 round1 station3 male6 female2", header = T) 

# numericize 
r1$Round = as.numeric(substr(r1$Round, 6, 6)) 
r1$Station = as.numeric(substr(r1$Station, start = 8, stop = 8)) 
r1$Male = as.numeric(substr(r1$Partner1, 5, 5)) 
r1$Female = as.numeric(substr(r1$Partner2, 7, 7)) 
r1[c("Partner1", "Partner2")] = list(NULL) 

# function 
next_round = function(r) { 
    r$Male = r$Male[c(3, 4, 5, 6, 1, 2)] 
    r$Female = r$Female[c(5, 6, 1, 2, 3, 4)] 
    problems = which(r$Male == r$Female) 
    # switch male problems 
    switch_with = ifelse(problems %% 2 == 0, problems - 1, problems + 1) 
    r$Male[c(rbind(switch_with, problems))] = r$Male[c(rbind(problems, switch_with))] 
    # increment round 
    r$Round = r$Round + 1 
    return(r) 
} 

# demonstration 
r1 
#  Round Station Male Female 
# 55  1  1 1  5 
# 109  1  1 3  4 
# 163  1  2 4  3 
# 217  1  2 2  1 
# 271  1  3 5  6 
# 10  1  3 6  2 
(r2 = next_round(r1)) 
#  Round Station Male Female 
# 55  2  1 2  6 
# 109  2  1 4  2 
# 163  2  2 6  5 
# 217  2  2 5  4 
# 271  2  3 1  3 
# 10  2  3 3  1 
(r3 = next_round(r2)) 
#  Round Station Male Female 
# 55  3  1 6  3 
# 109  3  1 5  1 
# 163  3  2 1  6 
# 217  3  2 3  2 
# 271  3  3 4  5 
# 10  3  3 2  4 

本質的には、男性と女性が出発駅の同性パートナーと一緒にいることです。男性は1ラウンドごとに1つのステーション番号に移動し、女性は1ラウンドごとに1つのステーション番号に移動し、男性=女性の衝突があった場合、そのステーションの男性はそれを修正するために切り替わります。私はスクエアダンスに触発されました。男性と女性が異なる方向に動いてパートナーを回転させるのが一般的です。

+0

これは完璧です、@ Gregorありがとう! –

+0

私は帽子でやめます:) –

+0

私はSquare Dancingとの比較も好きです –

関連する問題