员工 - 主管在R中排序

时间:2017-11-25 17:34:21

标签: r

我正在处理员工数据。整个数据框有104列,但为此,我只关心两列。我们有一个员工编号及其主管(以员工ID列中存在的主管ID的形式)。我需要对数据进行排序,以便员工编号高于主管ID列中的任何实例。

以下是我对解决方案的第一次尝试,但它有几个问题,我认为有更好的方法。现在,它不只是将行向上移动,而是添加一个新行,因此它永远不会完成。

任何帮助都将不胜感激。

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
}

更新: 有一个是主管。他们的SupervisorID与他们的EmpNo相同。员工编号的分类不相关,但必须高于向他们报告的任何人。以下是一些示例数据。

初始数据:

EmpNo   SupervisorID
1111    1118
1112    1117
1113    1114
1114    1112
1115    1112
1116    1118
1117    1117
1118    1117

期望的结果:

EmpNo   SupervisorID
1117    1117
1118    1117
1112    1117
1111    1118
1116    1118
1114    1112
1115    1112
1113    1114

更新: 更新了代码以使其完全可重现,包括中断以防止其无限运行。

1 个答案:

答案 0 :(得分:0)

以下是我使用的解决方案。它仍然有点慢,但它解决了这个问题。

'%!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
}