2016-10-24 2 views
0

Ich habe eine Gruppe von Menschen, die jeweils Präsentationen für eine Konferenz eingereicht haben. Jede Präsentation muss sieben Mal von den anderen Einsendern überprüft werden, aber kein Einsender sollte ihre eigene Präsentation überprüfen. Ich möchte jede Person nach dem Zufallsprinzip zuweisen, um 7 Präsentationen zu überprüfen, wobei jede Präsentation nur 7 Mal überprüft wird und keine Person ihre eigenen überprüft.Zufällig Daten zuweisen

Beispieldaten:

DT = data.frame(First_Name = letters[1:10], Presentation = 1:10)

Ich bin offen dies entweder R oder Excel zu tun. Jede Hilfe wird geschätzt.

+0

Wie viele Menschen sind in der Gruppe ?? –

+0

Wir haben 142 Personen – josh453

+0

Meine Lösung wird mit einer beliebigen Nummer funktionieren ............... siehe unten ........... –

Antwort

1

Mit Excel:

Platz die Mitglieder der Gruppe in Spalte A:

enter image description here

und führen Sie diesen Makro:

Sub Reviewers() 
    Dim N As Long, i As Long, j As Long, rA As Range 

    N = Cells(Rows.Count, "A").End(xlUp).Row 
    Set rA = Range("A1:A" & N) 
    ' 
    '----------------------------------PART 1 
    ' 
    For i = 1 To N 
     j = i + 1 
     rA.Copy Cells(1, j) 
     Cells(i, j).Delete shift:=xlUp 
    Next i 
    ' 
    '---------------------------------PART 2 
    ' 

    For i = 2 To N + 1 
     Call SkrambleRange(Range(Cells(1, i), Cells(N - 1, i))) 
    Next i 
End Sub 

    Sub SkrambleRange(rng As Range) 
     Dim arr(), r As Range, i As Long 
     ReDim arr(1 To rng.Count) 
     i = 1 
     For Each r In rng 
      arr(i) = r.Value 
      i = i + 1 
     Next r 

     Call Shuffle(arr) 

     i = 1 
     For Each r In rng 
      r.Value = arr(i) 
      i = i + 1 
     Next r 
    End Sub 

    Public Sub Shuffle(InOut() As Variant) 
     Dim i As Long, j As Long 
     Dim tempF As Double, Temp As Variant 

     Hi = UBound(InOut) 
     Low = LBound(InOut) 
     ReDim Helper(Low To Hi) As Double 
     Randomize 

     For i = Low To Hi 
      Helper(i) = Rnd 
     Next i 


     j = (Hi - Low + 1) \ 2 
     Do While j > 0 
      For i = Low To Hi - j 
       If Helper(i) > Helper(i + j) Then 
       tempF = Helper(i) 
       Helper(i) = Helper(i + j) 
       Helper(i + j) = tempF 
       Temp = InOut(i) 
       InOut(i) = InOut(i + j) 
       InOut(i + j) = Temp 
       End If 
      Next i 
      For i = Hi - j To Low Step -1 
       If Helper(i) > Helper(i + j) Then 
       tempF = Helper(i) 
       Helper(i) = Helper(i + j) 
       Helper(i + j) = tempF 
       Temp = InOut(i) 
       InOut(i) = InOut(i + j) 
       InOut(i + j) = Temp 
       End If 
      Next i 
      j = j \ 2 
     Loop 
    End Sub 

Teil 1 erzeugt eine Liste von Gutachtern für jeden Einreicher. So Spalte B ist die Rezensionsliste für Mary Smith (Mary Smith eigenen Namen wurde entfernt); Spalte C ist der Rezensent Liste für Patricia Johnson usw.

Teil 2 schlurft jeder der Rezensent Spalten .:

enter image description here

Um die 7 Rezensenten für Mary Smith zu bekommen, ziehen Sie den ersten 7 Namen aus der Spalte B.
Um die 7 Reviewer für Patricia Johnson zu erhalten, ziehen Sie die ersten 7 Namen aus der Spalte C, etc.

+0

Mit dieser Lösung hat jeder Prüfer 7 weitere Präsentationen zu überprüfen? ZB: Mary Smith hat sieben Personen, die ihren Vorschlag überprüfen, hat aber auch sieben Vorschläge zur Überprüfung. – josh453

+0

@ josh453 Deshalb verwende ich die vollständigen Daten für Spalte ** B ** .....Verwenden Sie ** B1 ** bis ** B7 ** für das erste Papier, dann verwenden Sie ** B8 ** bis ** B14 ** für das zweite Papier, etc .............. .... so bekommst du alle 49 Tipps * (7 x 7) * aus dem verfügbaren Pool. –

+0

Ich glaube, ich verstehe, danke! – josh453

0

Die Bibliothek igraph für R verfügt über Algorithmen für die Generierung von Zufallsgraphen. Es klingt so, als ob man jede Person mit 7 anderen Leuten zufällig verbinden möchte, sagen wir für eine Gruppe von 10 Personen. Dies könnte als Graph mit 10 Ecken dargestellt werden, die jeweils mit Grad 7.

Hier ist ein solches Verfahren in der Bibliothek

library(igraph) 
plot(g <- sample_degseq(rep(7,10),method="vl")) 

enter image description here

0

Hier ist eine Lösung mit linearer Programmierung. (Inspiriert von Randomly assign elements repeatedly to a limited number of groups und https://acoppock.github.io/subpages/Random_Assignment_Subject_To_Constraints.html)

library(lpSolve) 
library(tidyverse) 

df <- 
    # get all possible person-presentation combinations 
    expand.grid(person = letters[1:10], presentation = 1:10) %>% 
    mutate(person_number = match(person, letters)) %>% 
    # throw out self-matches 
    filter(presentation != person_number) 

# Two constraints: 
# each presentation is reviewed 7 times. 
# Each person conducts 7 reviews 

first <- t(sapply(1:10, function(i) as.numeric(df$presentation == i))) 
second <- t(sapply(letters[1:10], function(i) as.numeric(df$person == i))) 

const.mat <- rbind(first, second) 
const.dir <- rep(c("=", "="), c(10, 10)) 
const.rhs <- rep(c(7, 7), c(10, 10)) 

# This is the acutal stochastic part 
random_objective <- runif(ncol(const.mat)) 

mod <- lp(
    direction = "max", 
    objective.in = random_objective, 
    const.mat = const.mat, 
    const.dir = const.dir, 
    const.rhs = const.rhs, 
    all.bin = TRUE 
) 

df$assign_review <- mod$solution 

with(df, table(assign_review)) 
with(df, table(assign_review, presentation)) 
with(df, table(assign_review, person)) 

Dieser Ausgang erzeugt, wie gewünscht:

> with(df, table(assign_review, presentation)) 
      presentation 
assign_review 1 2 3 4 5 6 7 8 9 10 
      0 2 2 2 2 2 2 2 2 2 2 
      1 7 7 7 7 7 7 7 7 7 7 
> with(df, table(assign_review, person)) 
      person 
assign_review a b c d e f g h i j 
      0 2 2 2 2 2 2 2 2 2 2 
      1 7 7 7 7 7 7 7 7 7 7 
Verwandte Themen