Различение внутренних и внешних связей в R - PullRequest
0 голосов
/ 27 апреля 2018

я столкнулся со сложной ситуацией:
у меня есть два отдельных набора данных, как df1 и df2; df1 - это данные HR, а df2 - электронная почта крупной компании
столбцы df1: ID (адрес электронной почты), отдел, ...
столбцы df2: отправитель (адрес электронной почты), получатель (адрес электронной почты); между двумя узлами может быть несколько писем
постскриптум все изоляты удалены, и в сообщениях электронной почты нет петли
я также создал объект графа следующим образом:

g1<- graph.data.frame (df2[1,2], directed= T, vertices= df1)  

Теперь я хочу провести различие между внутренними связями (оба узла находятся в одном отделе) и внешними связями. я использовал следующий код:

E(g1)$internal= as.numeric ( df1$dept[df2$sender]== df1$dept[def2$receiver])

но результат - все НС. я знаю, что это происходит, поскольку каждая часть следующего кода (df1 $ dept [df2 $ sender] ИЛИ df1 $ dept [def2 $ receive) также возвращает только NA. не могли бы вы помочь мне погладить этот излом?

1 Ответ

0 голосов
/ 27 апреля 2018

Вы уже почти подошли к своему подходу, но вам нужен ваш вектор отделов, чтобы распознать индексацию по отправителю. Вы можете сделать это, назвав элементы в вашем векторе кода отдела. Пример кода показывает:

# 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», поэтому мы делаем то, что намеревались .

...