我有一个雇员的data.table,其中包含一个EmployeeID列和一个ManagerID列(这是同一表的EmployeeID列的外键)。 我正在尝试编写一个函数来为一组经理(不仅是直接下属,还有下属的下属等)返回所有下属的表。
这是我尝试过的:
getSubordinates <- function(mgrs){
mgrs[, ManagerID:=NULL]
setnames(mgrs, "EmployeeID", "ManagerID")
setkey(mgrs, "ManagerID")
setkey(emps, "ManagerID")
directReports <- emps[mgrs[, list(ManagerID)], nomatch=0]
print(directReports[0])
if(nrow(directReports)==0){
return(directReports[0]) # Return an empty table with all the columns of directReports
} else{
return(rbind(directReports, getSubordinates(directReports)))
}
}
emps <- data.table(EmployeeName=c("Bob", "John", "Sue", "Carl"), EmployeeID=c(1,2,3,4), ManagerID=c(NA,1,1,2))
emps
EmployeeName EmployeeID ManagerID
1: Bob 1 NA
2: John 2 1
3: Sue 3 1
4: Carl 4 2
但是,当我跑步时
getSubordinates(emps[EmployeeID==1])
我收到错误:
rbindlist(l, use.names, fill) 中的错误: 项目 2 有 3 列,与项目 1 有 2 列不一致。如果您需要填充缺少的列,请使用将参数"fill"设置为 TRUE。
我明白错误的含义,但无法弄清楚为什么会出现错误。
因为修改了函数调用中的data.table
,所以必须对其进行copy()
:
library(data.table)
getSubordinates <- function(mgrs){
mgrs[, ManagerID:=NULL]
setnames(mgrs, "EmployeeID", "ManagerID")
setkey(mgrs, "ManagerID")
setkey(emps, "ManagerID")
directReports <- emps[mgrs[, list(ManagerID)], nomatch=0]
if(nrow(directReports)==0){
return(directReports) # Return an empty table with all the columns of directReports
} else{
return(rbind( directReports, getSubordinates(copy(directReports))))
}
}
getSubordinates(emps[EmployeeID==1])
EmployeeName EmployeeID ManagerID
1: John 2 1
2: Sue 3 1
3: Carl 4 2