我正在处理员工数据。整个数据框有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
更新: 更新了代码以使其完全可重现,包括中断以防止其无限运行。
答案 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
}