r语言 - 使用 rbind() 的递归函数会导致错误"Item 2 has 3 columns, inconsistent with item 1 which has 2 columns"



我有一个雇员的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

相关内容

  • 没有找到相关文章

最新更新