Вы уже почти подошли к своему подходу, но вам нужен ваш вектор отделов, чтобы распознать индексацию по отправителю. Вы можете сделать это, назвав элементы в вашем векторе кода отдела. Пример кода показывает:
# I generate some fake data to mimic your problem
set.seed(125)
library(igraph)
# fake df1
df1 <- data.frame(ID = 1:9, dept = rep(LETTERS[1:3], 3), stringsAsFactors = F)
df1
#> ID dept
#> 1 1 A
#> 2 2 B
#> 3 3 C
#> 4 4 A
#> 5 5 B
#> 6 6 C
#> 7 7 A
#> 8 8 B
#> 9 9 C
# fake df2
df2 <- data.frame(sender = sample(1:9, 6, replace = T), receiver = sample(1:9, 6, replace = T))
df2
#> sender receiver
#> 1 8 5
#> 2 2 3
#> 3 3 6
#> 4 4 6
#> 5 9 1
#> 6 9 7
# the graph
g <- graph_from_data_frame(df2)
# You can get your general approach to work
# if the department codes are a named vector,
# where the names are the IDs. If this is the case
# a call like dept[c(ID1, ID3, ID2)] will ouput the
# department of individual 1, 3 and 2 in that order
named.dept <- df1$dept
names(named.dept) <- df1$ID
# To see how it works
named.dept[df2$sender]
#> 8 2 3 4 9 9
#> "B" "B" "C" "A" "C" "C"
# Now using your code
E(g)$internal <- as.numeric(named.dept[df2$sender] == named.dept[df2$receiver])
E(g)$internal
#> [1] 1 0 1 0 0 0
Возвращаясь назад, мы видим, что ребра 8-> 5 и 3-> 6 являются внутренними, потому что 8 и 5 оба находятся в «B», а 3 и 6 оба в «C», поэтому мы делаем то, что намеревались .