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

时间:2017-06-06 20:22:43

标签: r dplyr hierarchy

数据如下所示,称之为df1

员工ID |经理ID |管理水平

我正试图在某个管理级别由执行人员产生一个人数,让我们称之为“VP”级别。如何通过管理结构中的多个层进行汇总?我需要VP级别每位经理的总人数,其中包括较低级别的经理人员,他们向副总经理报告。

这是我到目前为止所做的:

require(dplyr)

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

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

即。 VP被列为经理三次,因此他的当前count = 3。这三位经理中的每一位都有4名他们管理的人。因此,有问题的VP的数量应该等于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))

2 个答案:

答案 0 :(得分:0)

试试这个:

#define MY_QUOTE(a) #a

#define CONCAT_QUOTE(a,b) MY_QUOTE(a##b)

#define CONCAT(a,b) a##b

// this works OK
#include CONCAT(<iostrea, m>)


// this doesn't as iostream should be just in <> rather than "<>"
#include CONCAT_QUOTE(<iostrea, m>)

这导致

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")

答案 1 :(得分:0)

对于此类数据,您可以使用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

或者,如果您只想要VP,可以使用返回命名列表的Get函数:

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

1 2 
4 3 

您甚至可以绘制(使用许多样式选项):

plot(tree1)

这样的情节,虽然有很多样式选项可用(见?plot.Node): enter image description here