1- library(dplyr )
2- library(data.table )
3- library(DiagrammeR )
1+ # make 'R CMD check' happy
2+ utils :: globalVariables(c(
3+ # get_nodes_from_event_logs()
4+ " event_name" ,
5+ " is_target" ,
6+ " name" ,
7+ # get_edges_from_event_logs()
8+ " customer_id" ,
9+ " timestamp" ,
10+ " from" ,
11+ " to"
12+ ))
413
514# ' @title Produce nodes from event logs
615# '
@@ -13,6 +22,13 @@ library(DiagrammeR)
1322# ' `get_nodes_from_event_logs()` will generate the node list from the given `event_logs` for the graph purpose.
1423# ' However, it is very basic, so, in most cases, you might want to provide your own node list to the
1524# ' `create_event_graph()` function.
25+ # ' @return a `data.frame` of nodes
26+ # ' @importFrom dplyr %>%
27+ # ' @importFrom dplyr select
28+ # ' @importFrom dplyr distinct
29+ # ' @importFrom dplyr rename
30+ # ' @importFrom dplyr mutate
31+ # ' @importFrom dplyr arrange
1632# ' @export
1733get_nodes_from_event_logs <- function (event_logs ) {
1834 nodes <- event_logs %> %
@@ -32,6 +48,16 @@ get_nodes_from_event_logs <- function(event_logs) {
3248# ' * `customer_id`: cutomer identifier. (`character`)
3349# ' * `event_name`: event name. (`character`)
3450# ' * `is_target`: whether it's the final stage. (`logical`)
51+ # ' @return a `data.frame` of edges
52+ # ' @importFrom dplyr %>%
53+ # ' @importFrom dplyr arrange
54+ # ' @importFrom dplyr group_by
55+ # ' @importFrom dplyr summarize
56+ # ' @importFrom dplyr ungroup
57+ # ' @importFrom dplyr mutate_if
58+ # ' @importFrom dplyr n
59+ # ' @importFrom data.table data.table
60+ # ' @importFrom data.table rbindlist
3561# ' @export
3662get_edges_from_event_logs <- function (event_logs ) {
3763 # sort by customer_id and timestamp
@@ -91,15 +117,30 @@ get_edges_from_event_logs <- function(event_logs) {
91117}
92118
93119# ' @title Create the event graph by given nodes and edges.
94- # ' @param nodes Event list, which should be a `data.frame` containing following columns:
120+ # ' @param nodes Event list
121+ # ' @param edges Event transform list
122+ # ' @description
123+ # ' `nodes` should be a `data.frame` containing following columns:
95124# ' * `name`: Nodes name, will be used as label. (`character`)
96125# ' * `is_target`: Whether it's final stage. (`logical`)
97126# ' * `percentage`: The percentage of customer affected by the given event. (`numeric`)
98- #
99- # ' @param edges Event transform list, which should be a `data.frame` containing following columns:
127+ # '
128+ # ' ` edges` should be a `data.frame` containing following columns:
100129# ' * `from`: the begining event of the edge. (`character`)
101130# ' * `to`: the ending event of the edge (`character`)
102131# ' * `value`: How many of customer affected by the given event. (`numeric`)
132+ # ' @importFrom dplyr %>%
133+ # ' @importFrom dplyr mutate
134+ # ' @importFrom dplyr mutate_if
135+ # ' @importFrom DiagrammeR create_graph
136+ # ' @importFrom DiagrammeR add_nodes_from_table
137+ # ' @importFrom DiagrammeR add_edges_from_table
138+ # ' @importFrom DiagrammeR add_global_graph_attrs
139+ # ' @importFrom DiagrammeR set_node_attrs
140+ # ' @importFrom DiagrammeR set_edge_attrs
141+ # ' @importFrom DiagrammeR select_nodes_by_degree
142+ # ' @importFrom DiagrammeR get_selection
143+ # ' @importFrom DiagrammeR delete_nodes_ws
103144# ' @export
104145create_event_graph <- function (nodes , edges ) {
105146 # print("Converting factor to character [nodes]...")
@@ -125,15 +166,15 @@ create_event_graph <- function(nodes, edges) {
125166 p <- p %> %
126167 add_nodes_from_table(
127168 table = nodes ,
128- label_col = name
169+ label_col = " name"
129170 )
130171
131172 # print("add_edges_from_table()")
132173 p <- p %> % add_edges_from_table(
133174 table = edges ,
134- from_col = from ,
135- to_col = to ,
136- ndf_mapping = name )
175+ from_col = " from" ,
176+ to_col = " to " ,
177+ ndf_mapping = " name" )
137178
138179 # print("add_global_graph_attrs()")
139180 p <- p %> %
@@ -154,31 +195,31 @@ create_event_graph <- function(nodes, edges) {
154195 p <- p %> %
155196 # node attributes
156197 # # grey900(#212121)
157- set_node_attrs(node_attr = fontcolor , values = " #212121" ) %> %
198+ set_node_attrs(node_attr = " fontcolor" , values = " #212121" ) %> %
158199 # # lightBlue900(#01579B)
159- set_node_attrs(node_attr = color , values = " #01579B" ) %> %
200+ set_node_attrs(node_attr = " color" , values = " #01579B" ) %> %
160201 # # lightBlue100(#B3E5FC) => lightBlue50(#E1F5FE)
161- set_node_attrs(node_attr = fillcolor , values = " #B3E5FC:#E1F5FE" ) %> %
162- set_node_attrs(node_attr = fontsize , values = (nodes $ percentage * 15 + 5 )) %> %
163- set_node_attrs(node_attr = label , values = nodes $ name ) %> %
164- set_node_attrs(node_attr = tooltip , values = nodes $ tooltip )
202+ set_node_attrs(node_attr = " fillcolor" , values = " #B3E5FC:#E1F5FE" ) %> %
203+ set_node_attrs(node_attr = " fontsize" , values = (nodes $ percentage * 15 + 5 )) %> %
204+ set_node_attrs(node_attr = " label" , values = nodes $ name ) %> %
205+ set_node_attrs(node_attr = " tooltip" , values = nodes $ tooltip )
165206
166207 # print("set_edge_attrs() for target nodes")
167208 target_ids <- nodes [nodes $ is_target , " index" ]
168209 p <- p %> %
169210 # # deepOrange900(#BF360C)
170- set_node_attrs(node_attr = color , values = " #BF360C" , nodes = target_ids ) %> %
211+ set_node_attrs(node_attr = " color" , values = " #BF360C" , nodes = target_ids ) %> %
171212 # # deepOrange100(#FFCCBC):deepOrange50(#FBE9E7)
172- set_node_attrs(node_attr = fillcolor , values = " #FFCCBC:#FBE9E7" , nodes = target_ids ) %> %
173- set_node_attrs(node_attr = fontsize , values = (nodes $ percentage * 10 + 15 ), nodes = target_ids )
213+ set_node_attrs(node_attr = " fillcolor" , values = " #FFCCBC:#FBE9E7" , nodes = target_ids ) %> %
214+ set_node_attrs(node_attr = " fontsize" , values = (nodes $ percentage * 10 + 15 ), nodes = target_ids )
174215
175216 # print("set_edge_attrs()")
176217 p <- p %> %
177218 # Edge attributes
178- set_edge_attrs(edge_attr = penwidth , values = log10(edges $ value ) + 1 ) %> %
179- set_edge_attrs(edge_attr = label , values = edges $ value ) %> %
180- set_edge_attrs(edge_attr = tooltip , values = edges $ tooltips ) %> %
181- set_edge_attrs(edge_attr = labeltooltip , values = edges $ tooltips )
219+ set_edge_attrs(edge_attr = " penwidth" , values = log10(edges $ value ) + 1 ) %> %
220+ set_edge_attrs(edge_attr = " label" , values = edges $ value ) %> %
221+ set_edge_attrs(edge_attr = " tooltip" , values = edges $ tooltips ) %> %
222+ set_edge_attrs(edge_attr = " labeltooltip" , values = edges $ tooltips )
182223
183224 # remove node without edges
184225 zero_degree_nodes <- p %> % select_nodes_by_degree(" deg == 0" ) %> % get_selection()
0 commit comments