【问题标题】:R: Summarize at specific hierarchy levelR:在特定层次结构级别进行汇总
【发布时间】:2017-06-06 20:22:42
【问题描述】:

数据长这样,叫df1

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

我正在尝试按某个管理级别的执行人员计算员工人数,我们称该级别为“副总裁”。如何通过管理结构中的多个层级进行总结?我需要每个 VP 级别经理的总人数,其中包括向 VP 级别经理报告的较低级别经理的人数。

这是我目前所拥有的:

require(dplyr)

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

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

I.E. VP 3 次被列为经理,所以他现在的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))

【问题讨论】:

  • 请提供要使用的数据。
  • 要放大@akash87 的评论,请使用dput(df1) 并将结果粘贴到您的问题中。如果数据太长,可以提供短样本dput(head(df1, 20))
  • 你从哪里得到数据?
  • @akash87 添加了模拟数据
  • 现在根据这些数据,输出应该是什么样子?

标签: r dplyr hierarchy


【解决方案1】:

对于这种类型的数据,您可以使用 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):

【讨论】:

    【解决方案2】:

    试试这个:

    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
    

    【讨论】:

    • 这很接近了,我也许可以调整它以使其在这一点上工作。你能解释一下cumsumlag 运算符是如何工作的吗?除此之外,逻辑是df.c 创建top.man.id,它将“父”管理器ID 分配给每个条目。 df.s 执行相同的转换,然后根据 top.man.id 进行计数。然后,连接将top.man.id 保留在数据框中。我在关注吗?
    • 到目前为止一切顺利。但是cumsumlag 在创建df.c 时协同工作以执行以下操作:cumsum 检查上面的行Manager.ID 是否不等于当前行的Manager.ID,并查看当前行是否行的Manager.ID 不等于上面行的Employee.ID。如果这成立,则加 1,因为 TRUE = 1 在数字方面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 2012-12-17
    相关资源
    最近更新 更多