2017-06-06 40 views
-2

數據看起來是這樣的,把它df1R:總結在特定層級

員工ID |管理員ID |管理水平

我想通過執行人員在一定的管理級別生成一個人員總數,讓我們稱之爲「VP」級別。我如何通過管理結構中的多層進行總結?我需要VP級每位經理人員的總人數,其中包括向較低級別的經理人員報告VP級別經理的人數。

這是我到目前爲止有:

require(dplyr) 

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

這告訴我每個管理者的人數。現在我需要將這些總數轉換爲副總裁級別經理的總數。

I.E. 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)) 
+0

請提供資料的項目。 – akash87

+0

要放大@ akash87的評論,請使用'dput(df1)'並將結果粘貼到您的問題中。如果數據太長,你可以用'dput(head(df1,20))' – G5W

+0

提供一個簡短的例子,你從哪裏得到數據? – akash87

回答

0

試試這個:

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 
+0

這很接近,我可能會調整它在此時的工作。你能解釋'cumsum'和'lag'運算符是如何工作的嗎?除此之外,邏輯是'df.c'創建'top.man.id',它爲每個條目分配「父」Manager ID。 'df.s'執行相同的轉換,然後根據'top.man.id'進行計數。然後,連接在數據框中保留'top.man.id'。我跟隨? – Mako212

+0

到目前爲止很好。但'cumsum'和'lag'一起工作以創建df.c:'cumsum'檢查以查看上面的'Manager.ID'行是否不等於當前行的'Manager.ID'並且看看當前行的'Manager.ID'是否與'Employee.ID'上面的行相同。如果這是真的,那麼加1,因爲在數字方面「TRUE = 1」。 – akash87

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 

或者,如果你只是想VPS時,您可以使用Get返回指定列表的函數:

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

1 2 
4 3 

你甚至可以(與許多樣式選項)劇情:

plot(tree1) 

該地塊這樣的,儘管許多造型可供選擇(見?plot.Node): enter image description here