[分享]座位表隨機產生器

作為助教總會有為了考試等需要而排座位的時候。
以下是我在2009年秋季學期中很無聊,不,是在期中很認真地思考該怎麼排學生座位的時候,用寫出來的一個函式。這個函式(命名為Seat)只要丟進[排數]、[列數]等參數定義值,就會自動以隨機亂數方式排成座位表,並轉成csv檔輸出。

##ReadMore##
Seat<-function(names,ROW,COL,n,byrow){
RN<-sample(1:n)
(table<-data.frame(names[,1],RN))
o<-order(table$RN)
if(byrow==F){
seat<-matrix(as.vector(table$names[o]),nrow=ROW,ncol=COL,byrow=F)
for (i in 1:ROW){
if(is.element(seat[i,COL],seat[,1:COL-1])==TRUE){seat[i,COL]<-c(".")}
}
} else{
seat<-matrix(as.vector(table$names[o]),nrow=ROW,ncol=COL,byrow=T)
for (i in 1:COL){
if(is.element(seat[ROW,i],seat[1:ROW-1,])==TRUE){seat[ROW,i]<-c(".")}
}
}
print(seat)
write.table(seat,file="seat.csv",quote=F,row.names=F,,col.names=F,sep=",")
}


使用步驟:

  1. 跑上面的code讓函式存入工作環境;
  2. 以一列直行到底的排列方式,將欲排入座位表的所有姓名存成一個csv檔;
  3. 將上述姓名csv讀入R;(例子:names<-read.table("names.csv",header=T,sep=","))
  4. 呼叫函式,輸入參數:
Seat(names,R,C,N,byrow=T)

其中

names→姓名物件名稱
R→橫排數
C→直列數
N→總人數
byrow=T(F)→橫(縱)向排序

執行完成後會將座位表print out在畫面上,並以seat.csv儲存在預設工作路徑。

幾點提醒:
  • 注意N<=R*C必然成立,否則可能會出現若干錯誤;
  • N若未定義為正確的人數(=在姓名csv檔中的列數),原則上跑不出來,因為隨機數字排序無法對應到每個姓名,例外是當非正確的人數等於N的某一因數,R會自動重複運算所以能剛好讓隨機數字填滿、對應到每一個姓名;
  • 當N不等於R*C時,R會自動重頭將已排入之姓名重新排入直到填滿表格為止,但這些重複且多餘的姓名在函式中已經刪除並以"."取代之。
熟悉使用S語言coding的人可以自行對code作調整。


我論有在使用R同時又有排座位表需求的人,在台灣應該是......
或許這篇應該寫成英文的好讓外國使用者可以比較容易google到!(就憑這種垃圾等級的code也想賺流量?)

0 comment(s):

Post a Comment

回應文章前請注意下列三勿原則:

1)勿拍照;(→會有靈異的照片從你的相機裡跑出來...
2)勿餵食;(→會有飢渴的猛獸從我的網誌裡跑出來...
3)勿告白。(→會有奇怪的東西從站長體內裡跑出來...

謝謝大家的配合。
( > ー <)b