首页 > 解决方案 > 创建网络变量以捕获通过 R 中的分组变量直接和间接连接的观察结果

问题描述

我有一个数据框,其中包括校长、他们工作的学校以及他们在那里工作的年限。我想创建一个新变量(网络)来表示他们所处的比较“网络”。在这里,网络对于在同一所学校工作的不同年份的任何校长任何其他工作的校长都具有相同的值在另一所学校,该学校的校长也曾在该学校工作,以及所有其他也在该学校工作的校长,在另一所学校工作的任何其他校长,该学校的校长也曾在该学校工作,依此类推。网络也可以在学校级别定义,其中网络是一组学校,其中每所学校在数据中的年份中至少有一名校长转移到网络中的至少一所其他学校。

从本质上讲,该变量应该“连接”通过他们工作过的学校联系的所有校长,以便最终可以在增值模型中将他们相互比较。每个委托人都有一个独特的网络价值。

这是一个(非常)简化的数据框来表示数据结构:

library(tidyverse)
library(data.table)

#basic data  
ps <- data.frame(principal = rep(letters[1:5], each = 4), 
                 year=rep(1:4))

recode_if <- function(x, condition, ...) {
  if_else(condition, recode(x, ...), x)
}

#add in schools and then create some variation to demonstrate different ways to connect   
ps <- ps %>%   
  mutate(school = fcase(  
             principal=="a", "fhs",   
             principal=="b", "ghs",   
             principal=="c", "lms",   
             principal=="d", "pms",   
             principal=="e", "ehs",   
             default=NA_character_)) %>%   
  mutate(school = recode_if(school, principal=="b" & year>=2,   
                            "ghs"="lms")) %>%   
  mutate(school = recode_if(school, principal=="c" & year>=2,   
                            "lms"="tms")) %>%   
  mutate(school = recode_if(school, principal=="d" & year>=4,   
                           "pms"="ehs")) %>%   
  mutate(school = recode_if(school, principal=="e" & year>=4,   
                            "ehs" = NA_character_))  

在上面的示例中,校长 a 将在他们自己的网络中,因为他们没有在 fhs 以外的任何学校工作过,该数据集中的任何其他校长也没有在 fhs 工作过。主体 b 和 c 将具有相同的网络值,通过 lms 连接。该网络中没有其他负责人,因为没有其他人曾在 ghs、lms 或 tms 工作过。校长 d 和 e 将在同一个网络中,通过 ehs 连接。

我曾尝试探索社交网络分析世界,但运气不佳,虽然我之前没有使用过这种类型的数据,所以答案可能就在那里!我还尝试了一些不同的循环方法,但也无法使其正常工作。

任何帮助,将不胜感激!太感谢了!

标签: rnetworkingsocial-networking

解决方案


这是一种使用tidygraph, 包装器的方法igraph

# Show all links where two principals worked at same school (incl self-joins)
ps %>%
  left_join(ps, by = "school") %>%
  select(principal.x, principal.y) -> links


library(tidygraph)
links %>% 
  as_tbl_graph(directed = FALSE) %>% 
  mutate(group = group_components()) %>%
  activate(nodes) %>%
  data.frame() 


#  name group
#1    a     3
#2    b     1
#3    c     1
#4    d     2
#5    e     2

推荐阅读