R로 무작위 팀을 배정하는 함수를 만들었다. 사실 python으로 GUI 실행 프로그램으로 만들었는데, R로 해오라고 하셔서 둘째 주에 같은 프로그램을 R로 새로 만들었다… 새로운 언어지만 직접 프로그램을 만드니까 더 빠르게 배울 수 있는 것 같다. 스스로 복습하기 위해 다시 정리해봤다.
구글 R 가이드라인 준수하여 작성
description : 팀장을 입력하고 한양대 출석부 파일(xls, xlsx 포맷)을 작업 디렉토리 안에 넣으면 알아서 팀 배정을 해준다. (only 한양대 출석부만 됨!) 자세한 것은 함수 초반의 주석 부분을 읽는다.
R.andom.team <- function(fileName, leaders, times=1) { # @Roseline Song 2019 # Assigns teams randomly from attendance file. # # Args: # fileName: file must be '.xls' or '.xlsx' format and below working directory # leaders : vector of leaders' name for assigning teams # times : How many times the teams will be shuffled? # # Returns: # Data frame of team randomly assigned library(readxl) # Get filePath wd_path <- getwd() filePath <- paste(wd_path,"/", fileName, sep="") tryCatch(raw_df <- read_excel(filePath, na="", skip=11, col_names=FALSE), error=function(e) print("파일이 작업 폴더 안에 있는지, 또는 확장자를 확인해주세요."), warning=function(w) print("warning! warning!"), finully=NULL) # Indexing df <- raw_df[, c(4,6,7)] df <- na.omit(df) # Rename columns colnames(df) <- c("major", "id", "name") print(df) # Devide groups into two groups(leaders, mates) l_df <- df[df$name %in% leaders, ] m_df <- df[!df$name %in% leaders, ] # Assign team numbers to leaders team_num <- seq(1,length(leaders)) l_df["team"] <- team_num # Random shuffle mates for(n in seq(times)){ m_df <- m_df[sample(nrow(m_df)), ] }
# Assign team numbers to mates rep_num <- rep(team_num, (round(nrow(m_df)/length(team_num)))+1) m_df["team"] <- rep_num[1:nrow(m_df)] # Row bind leaders_group and mates_group rand_teams <- rbind(l_df, m_df) ########## Show result ########## require(dplyr) # Slicing id : 2014047538 -> 14 rand_teams["id"]<- unlist(mutate( (floor(rand_teams["id"]/1e+06)) %% 2000 )) # Change string to integer tmp <- rand_teams tmp$major[!(tmp$major=="광고홍보학과")] <- 1 tmp$major[tmp$major=="광고홍보학과"] <- 0 tmp$major <- as.numeric(tmp$major) # Show team result rand_teams <- rand_teams[order(rand_teams$team),] print("랜덤 팀") for( i in team_num){ print(filter(rand_teams, team==i)) } # Mean of id by team print("팀별 평균 학번") print(aggregate(rand_teams["id"], by=rand_teams["team"], mean )) # Other majors in each team print("팀별 타과생 수") print(aggregate(tmp["major"], by=tmp["team"], sum)) return(rand_teams) }
########## Show result ########## require(dplyr) # Slicing id : 2014047538 -> 14 rand_teams["id"]<- unlist(mutate( (floor(rand_teams["id"]/1e+06)) %% 2000 )) # Change string to integer tmp <- rand_teams tmp$major[!(tmp$major=="광고홍보학과")] <- 1 tmp$major[tmp$major=="광고홍보학과"] <- 0 tmp$major <- as.numeric(tmp$major) # Show team result rand_teams <- rand_teams[order(rand_teams$team),] print("랜덤 팀") for( i in team_num){ print(filter(rand_teams, team==i)) } # Mean of id by team print("팀별 평균 학번") print(aggregate(rand_teams["id"], by=rand_teams["team"], mean )) # Other majors in each team print("팀별 타과생 수") print(aggregate(tmp["major"], by=tmp["team"], sum)) return(rand_teams) }
함수의 핵심 로직은 4번에서 끝났고, 5번부터는 console에 데이터를 보여주는 것이다. 팀마다의 공정성을 고려해 팀별 평균 학번, 팀별 타과생 수를 볼 수 있게 했다. 사실 팀별 학번이나 타과생 수에 조건을 주어서 다시 한 번 랜덤 배정을 하는 방법을 생각해봤는데, 어떻게 할 지 방법이 떠오르지 않았다.
지금도 그닥 좋은 수가 생각나지 않는다. 혹시 좋은 생각이 있다면 알려주시면 좋을 것 같습니다.