R:在特定层次结构级别进行汇总

R: Summarize at specific hierarchy level

数据看起来像这样,称它为df1:

员工编号 |经理编号 |管理层

我正在尝试生成某个管理级别的执行人员人数,我们称该级别为 "VP"。我如何通过管理结构中的多个层级进行总结?我需要每个 VP 级别经理的总人数,其中将包括较低级别的经理人数,他们向 VP 级别经理报告。

这是我目前所拥有的:

require(dplyr)

managers <- group_by(df1, Manager.ID)
summarize(managers, count =n())

这告诉我每个经理的人数。现在我需要将这些总计计入 VP 级别经理的计数。

即VP被列为经理3次,所以他现在的count=3。这三位经理中的每一位都管理着 4 个人。因此,相关副总裁的计数应等于 15。

我怎样才能达到这个级别?

数据:

df1 <- structure(list(Employee.ID = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 27L
), Manager.ID = c(27L, 27L, 1L, 2L, 4L, 1L, 1L, NA), Management.Level = structure(c(5L, 
5L, 1L, 1L, 3L, 3L, 4L, 2L), .Label = c("ASSOC", "CEO", "Entry", 
"Etnry", "VP"), class = "factor")), .Names = c("Employee.ID", 
"Manager.ID", "Management.Level"), class = "data.frame", row.names = c(NA, 
-8L))

试试这个:

df.c<- df1 %>% 
       arrange(Manager.ID, Employee.ID) %>% 
       mutate(gr = cumsum(lag(Manager.ID, default = 0) != Manager.ID &
                          lag(Employee.ID, default = 0) != Manager.ID)) %>%
       group_by(gr) %>% 
       summarise(top.man.id = min(Manager.ID))

df.s<- df1 %>% 
       arrange(Manager.ID, Employee.ID) %>% 
       mutate(gr = cumsum(lag(Manager.ID, default = 0) != Manager.ID &
                          lag(Employee.ID, default = 0) != Manager.ID)) %>%
       group_by(gr) %>% 
       summarise(count = n()) %>%
       inner_join(df.c, by = "gr")

这导致

# A tibble: 4 × 3
     gr Count top.man.id
  <int> <int>      <int>
1     1     3          1
2     2     2          2
3     3     2         27
4    NA     1         NA

对于此类数据,您可以使用 data.tree 包。

library(data.tree)

#convert factors to string
df1$Management.Level <- as.character(df1$Management.Level)

#convert df1 to data.tree
tree1 <- FromDataFrameNetwork(df1[-nrow(df1),])
tree1$Management.Level <- 'CEO'

您现在可以打印报告的组织结构图数量:

print(tree1, 'Management.Level', 'totalCount')

显示如下:

      levelName Management.Level totalCount
1 27                         CEO          8
2  ¦--1                       VP          4
3  ¦   ¦--3                ASSOC          1
4  ¦   ¦--6                Entry          1
5  ¦   °--7                Etnry          1
6  °--2                       VP          3
7      °--4                ASSOC          2
8          °--5            Entry          1

或者,如果您只需要 VPs,您可以使用 Get 函数,其中 returns 一个命名列表:

tree1$Get('totalCount', filterFun = function(node) node$Management.Level == 'VP')

1 2 
4 3 

您甚至可以绘图(有许多样式选项):

plot(tree1)

虽然有许多样式选项可用(请参阅 ?plot.Node),但它的绘图是这样的: