2016-07-21 13 views
0

Ich habe es mit einem Datensatz, wo ich Schüler Bewertungen von Lehrern haben. Einige Schüler bewerteten den gleichen Lehrer mehr als einmal. Was möchte ich mit den Daten zu tun, ist es mit den folgenden Kriterien zur Teilmenge:Wählen Sie zufällige Zeilen von doppelten IDS

1) Halten Sie einen eindeutigen Student Ids und Bewertungen

2) In Fällen, in denen die Schüler zweimal einen Lehrer nur 1 Bewertung halten bewertet , aber um auszuwählen, welche Bewertung zufällig zu halten ist.

3) Wenn möglich, möchte ich den Code in einem Munging-Skript am Anfang jeder Analysedatei ausführen und sicherstellen, dass die erstellte Datenmenge für jede Analyse genau gleich ist (set seed?).

# data 
student.id <- c(1,1,2,3,3,4,5,6,7,7,7,8,9) 
teacher.id <- c(1,1,1,1,1,2,2,2,2,2,2,2,2) 
rating <- c(100,99,89,100,99,87,24,52,100,99,89,79,12) 
df <- data.frame(student.id,teacher.id,rating) 

Danke für jede Anleitung, wie Sie vorwärts gehen können.

Antwort

1

Angenommen, dass jede student.id nur auf einen Lehrer angewendet wird, können Sie die folgende Methode verwenden.

# get a list containing data.frames for each student 
myList <- split(df, df$student.id) 

# take a sample of each data.frame if more than one observation or the single observation 
# bind the result together into a data.frame 
set.seed(1234) 
do.call(rbind, lapply(myList, function(x) if(nrow(x) > 1) x[sample(nrow(x), 1), ] else x)) 

Das gibt

student.id teacher.id rating 
1   1   1 100 
2   2   1  89 
3   3   1  99 
4   4   2  87 
5   5   2  24 
6   6   2  52 
7   7   2  99 
8   8   2  79 
9   9   2  12 

Wenn die gleichen student.id Raten mehrere Lehrer, dann ist diese Methode den Bau einer neuen Variablen mit der interaction Funktion erfordert:

# create new interaction variable 
df$stud.teach <- interaction(df$student.id, df$teacher.id) 

myList <- split(df, df$stud.teach) 

dann ist der Rest des Codes identisch mit dem oben.


Eine potenziell schnellere Methode ist es, die data.table Bibliothek und rbindlist zu verwenden.

library(data.table) 
# convert into a data.table 
setDT(df) 

myList <- split(df, df$stud.teach) 

# put together data.frame with rbindlist 
rbindlist(lapply(myList, function(x) if(nrow(x) > 1) x[sample(nrow(x), 1), ] else x)) 
+1

was würde sich ändern, wenn ein Schüler mehrere Lehrer bewertet? Ich kann meine Daten aktualisieren. – bfoste01

+1

Die Aufteilung müsste auf einer Variablen sein, die den Lehrer und die Schüler-IDs interagiert. Siehe meine aktualisierte Antwort. – lmo

+0

Fantastisch. Das hilft sehr! Gibt es eine Möglichkeit, diesen Code zu beschleunigen? Ich habe 100.000 IDS, also ist es ziemlich langsam, im letzten do.call zu einer Lösung zu konvergieren oder ist das so schnell wie es geht? – bfoste01

Verwandte Themen