2017-06-06 2 views
-2

df1それを呼び出す特定の階層レベルで要約:R:データはこのようになります

従業員ID |マネージャID |管理レベル

特定の管理レベルで経営幹部の人数を生成しようとしていますが、そのレベルをVPと呼びましょう。管理構造に複数の層をどのように要約するのですか? VPレベルの各マネージャの総人数が必要です。これには、VPレベルのマネージャに報告する下位レベルのマネージャの人数が含まれます。私に各マネージャの人員を告げる

require(dplyr) 

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

を:

は、これは私がこれまで持っているものです。今では、これらの合計をVPレベルのマネージャーにカウントする必要があります。

I.E. VPはマネージャーとして3回リストされているので、現在のcount = 3です。これらの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

はこれを試してみてください。これは、このタイプのデータの

# 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'を作成し、各エントリに「親」マネージャIDを割り当てます。 'df.s'は同じ変換を行い、' top.man.id'に基づいて数えます。次いで、結合は、データフレームに「top.man.id」を保存する。私はフォローですか? – Mako212

+0

これまでのところとても良い。しかし、 'cumsum'と' lag'はdf.cを作る際に次のことをするために一緒に働きます。 'cumsum'は、' Manager.ID'の行が現在の行の 'Manager.ID'と等しくないかどうかを調べ、現在の行の 'Manager.ID'が上記の' Employee.ID'の行と等しくないかどうか確認してください。これが真であれば、数値で 'TRUE = 1'なので1を加えます。 – 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") 

、あなたは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' 

 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をしたい場合は、あなたが使用することができます。これは、次のように示して

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

Get名前付きリストを返す関数:

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

1 2 
4 3 

あなたは(多くのスタイリングオプション付き)でもプロットすることができます:多くのスタイリングオプションが(?plot.Nodeを参照)用意されていても、

plot(tree1) 

このように、このプロット: enter image description here

関連する問題