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
),但它的绘图是这样的:
数据看起来像这样,称它为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
),但它的绘图是这样的: