Ich arbeite mit Mitarbeiterdaten. Der gesamte Datenrahmen hat 104 Spalten, aber ich bin nur um zwei Spalten besorgt. Wir haben eine Mitarbeiternummer und ihren Vorgesetzten (in Form einer Vorgesetzten-ID, die in der Spalte Mitarbeiter-ID vorhanden ist). Ich muss die Daten sortieren, so dass die Angestelltennummer über jeder Instanz davon in der Supervisor-ID-Spalte steht.Employee-Supervisor Sortierung in R
Unten ist mein erster Stich zu einer Lösung, aber es hat ein paar Probleme, und ich nehme an, es gibt einen besseren Weg, es zu tun. Im Moment wird die Zeile nicht einfach nur nach oben verschoben, sondern es wird eine neue Zeile hinzugefügt, sodass sie nie abgeschlossen wird.
Jede Hilfe wäre willkommen.
library(iterators)
EmpNo <- c(1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118)
SupervisorID <- c(1118, 1117, 1114, 1112, 1112, 1118, 1117, 1117)
supervisors <- data.frame(EmpNo, SupervisorID)
loop <- TRUE
while(loop)
{
loop <- FALSE
iSupervisor <- iter(supervisors, by ='row')
for(i in 1:nrow(supervisors))
{
tempElem <- nextElem(iSupervisor)
if(nrow(tempElem) == 1)
{
# It does not properly move the row.
if(i > 1)
{
if(nrow(supervisors[tempElem$EmpNo %in% supervisors[1:(i-1),"SupervisorID"]]) > 0)
{
if(length(which(supervisors$SupervisorID == tempElem$EmpNo)) != 0)
{
sup.first <- min(which(supervisors$SupervisorID == tempElem$EmpNo))
if(sup.first > i)
{
loop <- TRUE
if(i == nrow(supervisors))
{
if(sup.first == 1)
{
supervisors <- rbind(supervisors[i,],supervisors[1:(i-1),])
} else
{
supervisors <- rbind(supervisors[1:(sup.first-1),],supervisors[i,],supervisors[sup.first:(i-1),])
}
} else
{
if(sup.first == 1)
{
supervisors <- rbind(supervisors[i,],supervisors[1:(i-1),], supervisors[(i+1):nrow(supervisors),])
} else
{
supervisors <- rbind(supervisors[1:(sup.first-1),],supervisors[i,],supervisors[sup.first:nrow(supervisors),])
}
}
}
}
}
}
}
if(nrow(supervisors) > 50) { loop <- FALSE }
}
rownames(supervisors) <- NULL
}
UPDATE: Es ist eine, die der Kopf Supervisor ist. Ihre SupervisorID ist die gleiche wie ihre EmpNo. Die Sortierung der Angestelltennummer ist nicht relevant, außer dass sie über jedem sein muss, der ihnen berichtet. Unten finden Sie einige Beispieldaten.
Initial Data:
EmpNo SupervisorID 1111 1118 1112 1117 1113 1114 1114 1112 1115 1112 1116 1118 1117 1117 1118 1117
Gewünschtes Ergebnis:
EmpNo SupervisorID 1117 1117 1118 1117 1112 1117 1111 1118 1116 1118 1114 1112 1115 1112 1113 1114
UPDATE: den Code aktualisiert, um es vollständig reproduzierbar zu machen, eine Pause einschließlich, damit er nicht unendlich laufen.
könnten wir ein * kleines * reproduzierbares Beispiel haben? –
Haben die Supervisoren Vorgesetzte? In Ihrer gewünschten Lösung, gibt es jemanden, der erlaubt ist, der Erste zu sein? Es müsste jemand ohne Vorgesetzten sein. – G5W
Ja, die Supervisoren können Supervisoren haben, und es gibt einen, der ganz oben steht. Ich werde einige Beispieldaten hinzufügen. –