1

Objective: I want to count the number of incoming edges of a partial type for each node. How can I do that?

Criteria:

  • I need to use the R package tidygraph
  • Answers that allow me to mutate an existing graph via a magrittr pipeline are better
  • Fewer lines of code are better

The following code will generate an example graph

g <- play_erdos_renyi(n = 20, p = .10) %>% 
  activate(edges) %>% 
  mutate(type = sample(c('a', 'b', 'c'), size = n(), replace = T))

Ideal output, when searching (for example) for incoming g edges if type "a" would look like:

Node   type_a_edges
X           3
Y           1
Z           4
...

EDIT: Added a figure to make the problem more concrete.

How do we count the incoming links of type a for each node?

Ian Cero
  • 360
  • 1
  • 8
  • Regarding your post, you didn't specify your objective or expected output. You just put your thoughts over there but nobody knows what you are exactly looking for. Also, you said "What is the best, most tidygraph way to count the number of incoming edges of a certain type, for each node (i.e., the nodes "type a indegree")?". This is opinion-based question, since you can never say something is the BEST. This kind of question should be voted to closed since it doesn't follow the criteria of SO for asking technical questions, unless you specify your objective and output. – ThomasIsCoding May 27 '21 at 20:18
  • I have edited the question and my answer to be consistent with your recommendations. Please re-open the question. – Ian Cero May 30 '21 at 03:23
  • Yes, now it looks much better. I voted it for reopen. But it seems you have answered your own question, haven't your? https://stackoverflow.com/a/67695157/12158757 – ThomasIsCoding May 30 '21 at 21:23
  • That's a fair point. I think I have. You make a good point. – Ian Cero May 31 '21 at 01:01
  • I updated my answer so you can see if that is what you are looking for – ThomasIsCoding Jun 01 '21 at 06:47

2 Answers2

2

Here is an tidygraph + dplyr option

g %>%
  activate(edges) %>%
  filter(type == "a") %>%
  as_tibble() %>%
  group_by(to) %>%
  summarise(indegree_a = n())

which gives counts of all type "A" of inwards edges

# A tibble: 8 x 2
     to indegree_a
  <int>      <int>
1     3          1
2     5          1
3     8          2
4    11          1
5    12          1
6    15          2
7    17          2
8    18          2

If you want to have full information of all nodes, you can try the code below

g %>%
  activate(edges) %>%
  as_tibble() %>%
  select(-from) %>%
  mutate(counts = 1) %>%
  arrange(type) %>%
  pivot_wider(
    names_from = type,
    values_from = counts,
    values_fill = 0, values_fn = sum, names_glue = "indegree_{.name}"
  ) %>%
  arrange(to)

which gives

# A tibble: 18 x 4
      to indegree_a indegree_b indegree_c
   <int>      <dbl>      <dbl>      <dbl>
 1     1          0          1          2
 2     2          0          0          1
 3     3          1          0          0
 4     4          0          2          0
 5     5          1          0          2
 6     6          0          1          1
 7     8          2          1          0
 8     9          0          0          1
 9    10          0          0          1
10    11          1          1          0
11    12          1          0          1
12    13          0          1          2
13    15          2          0          0
14    16          0          3          0
15    17          2          0          0
16    18          2          1          0
17    19          0          0          1
18    20          0          1          0
ThomasIsCoding
  • 96,636
  • 9
  • 24
  • 81
0

This will produce output consistent with the request

g %>%  
  activate(nodes) %>% 
  mutate(
    indegree_type_a = centrality_degree(
      weights = as.numeric(.E()$type == 'a'),
      mode = 'in'))
Ian Cero
  • 360
  • 1
  • 8
  • 1
    I think you should put your questions in the post, rather than here as an answer. – ThomasIsCoding May 25 '21 at 20:57
  • Can you help me understand your thinking here? Looking at my response, I don't actually ask any novel questions in my answer - and it IS an effective answer to the question, as asked - I only point out some limitations to this answer that future readers might care about. For example, it is a limitation that my answer cannot address some of the next most logical questions to ask. – Ian Cero May 27 '21 at 17:44
  • Yes, you have an answer here, but what do you want after point out the limitations? Your post in SO is for questions, not to have chat or discussions. I didn't see your what you are really asking in your post and don't know what you are looking for indeed. – ThomasIsCoding May 27 '21 at 20:21