2017-12-29 51 views
0

나는 라운드, 스테이션 및 플레이어 (남녀)의 4 가지 변수의 가능한 모든 조합을 사용하는 r- 스크립트를 작성 중입니다. 다음이되어이 데이터 집합에서반복자가없는 라운드로 4 명의 다른 플레이어를 지정

 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 

:

3 라운드, 3 개 역, 6 남성 아래

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 행은 다음과 같습니다 아래는 데이터 세트 내 dput 버전입니다 6 여성

나는 다음 어떻게해야합니까 :

1) 어떤 사람이에 없어야합니다 동일한 기지국 회

2) 누구도 동일한 라운드 없어야 회

3) 누구도 동일한 사람 배

4) 각 스테이션 2 남성과 여성 2

을 요구와 제휴되지 않아야

5) 이상적으로, 각 개인은 이전 라운드에서 그와 함께하지 않은 라운드의 사람들과 함께 있어야합니다.

 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 

:

6) 마지막에 같은 수의 (male1, female1있는 플레이어) 그래서 최종 출력은 라운드 중 하나의 모양은

을 제휴하지 말아야 round2의 경우 3 개의 모든 스테이션이 있어야하지만 남성 및 여성 파트너는 변경해야하며 위에서 설명한 규칙을 따라야합니다.

또한 추가 방송국을 추가하지 않으면 수학적으로 불가능한 경우 알려 주시기 바랍니다.

도움이 될 것입니다.

+0

다음 라운드에서 각 남성 스테이션에 1을 더하고 다음 라운드 (모드 3)에서 각 여성 스테이션에 1을 빼십시오. 남성 번호 = 여성 번호가있는 상황에 처한 경우 동일한 역의 두 여성이 전환되도록하십시오. – Gregor

+0

입력 해 주셔서 감사합니다. Gregor! 이 논리는 역 에서뿐만 아니라 라운드로 작동합니까? –

+0

질문을 이해할 수 없습니다. 당신이 가진 것처럼 유효한 시작 라운드를 기반으로 다음 2 라운드를 생성합니다. – Gregor

답변

1

다음은 간단한 해결책입니다. 엄격한 요구 사항이 아닌 것 같아 (엄격한 규칙으로는 가능하지 않다고 생각하기 때문에) 나는 무시한다.

이 함수는 유효한 첫 번째 라운드를 입력으로 사용하고 두 번째 라운드 (두 번째 라운드는 다시 적용되는 경우)에 적합한 구성을 출력합니다.

문자열보다 조작하기 쉬운 숫자를 갖도록 데이터를 수정했습니다. 엄밀히 말하면, 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 

기본적으로 남성과 여성은 출발점과 동성 파트너가됩니다. 남성은 매 라운드마다 하나의 스테이션 번호로 이동하고, 여성은 매 라운드마다 하나의 스테이션 번호 위로 이동하고, 남성 = 여성 충돌이있는 경우 해당 스테이션의 남성은이를 수정하기 위해 전환합니다. 나는 광장 댄스에서 영감을 얻었습니다. 남성과 여성이 서로 다른 방향으로 움직여 파트너를 회전시키는 것이 일반적입니다.

+0

이것은 완벽합니다, @ Gregor 감사합니다! –

+0

대문자로 끝낼 것입니다. –

+0

Square Dancing과 비교해도 좋습니다. 그게 바로 이것 때문입니다. –