2017-11-25 4 views
-2

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.

+2

könnten wir ein * kleines * reproduzierbares Beispiel haben? –

+0

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

+0

Ja, die Supervisoren können Supervisoren haben, und es gibt einen, der ganz oben steht. Ich werde einige Beispieldaten hinzufügen. –

Antwort

0

Unten ist die Lösung, mit der ich ging. Es ist immer noch ein bisschen langsam, aber es löst das Problem.

'%!in%' <- function(x,y)!('%in%'(x,y)) 

EmpNo <- c(1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118) 
SupervisorID <- c(1118, 1117, 1114, 1112, 1112, 1118, 1117, 1117) 
Status <- c('A','A','A','A','A','A','A','A') 
check <- c(1,2,3,4,5,6,7,8) 
supervisors <- data.frame(EmpNo, SupervisorID, Status, check, stringsAsFactors = FALSE) 

loop <- TRUE 
while(loop) 
{ 
    loop <- FALSE 
    supervisors$check <- apply(supervisors[,c('EmpNo', 'check', 'Status')], 1, function(y) { 
    if(y['Status'] %!in% c('T','N')){ 
     if(nrow(supervisors[y['EmpNo'] %in% supervisors[1:max(((as.numeric(y['check'])-1)),1),"SupervisorID"]]) > 0) 
     { 
     if(length(which(supervisors$SupervisorID == y['EmpNo'])) > 0) 
     { 
      sup.first <- min(which(supervisors$SupervisorID == y['EmpNo'])) 
      if(sup.first < as.numeric(y['check'])) 
      { 
      loop <<- TRUE 
      } 
      sup.first - 1 
     } else 
     { 
      nrow(supervisors) 
     } 
     } 

    } else { 
     nrow(supervisors) 
    } 
    }) 
    supervisors <- supervisors[order(supervisors$check),] 
    supervisors$check <- as.numeric(rownames(supervisors)) 
    rownames(supervisors) <- NULL 
}