当存在包含多个提到的用户的观察时,如何为推文中提到的每个用户创建边缘列表

How to create an edge list for each user mentioned in a tweet when there are observations containing several user mentioned

我想对一些我感兴趣的用户的推文和他们推文中提到的用户的推文进行网络分析。

我使用 r 中的 rtweet 包从几个用户时间线检索了推文(没有转发),想看看他们在推文中提到了谁。

甚至还有一个变量,其中包含提到的那些用户的屏幕名称,这将作为我的边缘列表的目标组。但有时他们会提到几个用户,然后观察结果看起来像这样:c('luigidimaio', 'giuseppeconteit') 而只提到一个用户,它只是将这个用户命名为观察结果(例如 agorarai)。我想将包含多个提到的用户的那些观察结果拆分为每个用户的单个观察结果。因此,从一个包含两个提到的用户作为向量的观察中,我必须将其分成两个观察,每个观察包含一个提到的用户。

到目前为止,代码如下所示:

# get user timelines of the most active italian parties (excluding retweets)
tmls_nort <- get_timelines(c("Mov5Stelle", "pdnetwork", "LegaSalvini"), 
                      n = 3200, include_rts = FALSE
                      )

# create an edge list
tmls_el = as.data.frame(cbind(Source = tolower(tmls_nort$screen_name), Target = tolower(tmls_nort$mentions_screen_name)))

这是我的数据框的摘录:

Source Target n 
<fct> <fct> <int> 
1 legasalvini circomassimo 2 
2 legasalvini 1giornodapecora 2 
3 legasalvini 24mattino 2 
4 legasalvini agorarai 28 
5 legasalvini ariachetira 2
6 legasalvini "c(\"raiportaaporta\", \"brunovespa\")" 7 
```

我们可以从这里开始:首先你可以清理你的列,整理数据并绘制你的网络。 我使用的数据是:

tmls_el 
            Source                                                                    Target  n
1      legasalvini                                                              circomassimo  2
2      legasalvini                                                           1giornodapecora  2
3      legasalvini                                                                 24mattino  2
4      legasalvini                                                                  agorarai 28
5      legasalvini                                                               ariachetira 26
6      legasalvini                                         c("raiportaaporta", "brunovespa")  7
7 movimento5stelle c("test1", "test2", "test3", "test4", "test5", "test6", "test7", "test8") 20

现在我做了什么:

# here you replace the useless characer with nothing
tmls_el$Target <- gsub("c\(\"", "", tmls_el$Target)
tmls_el$Target <- gsub("\)", "", tmls_el$Target)
tmls_el$Target <- gsub("\"", "", tmls_el$Target)

library(stringr)
temp <- data.frame(str_split_fixed(tmls_el$Target, ", ", 8))
tmls_el_2 <- data.frame(   
  Source = c(rep(as.character(tmls_el$Source),8))
  , Target = c(as.character(temp$X1),as.character(temp$X2),as.character(temp$X3),
               as.character(temp$X4),as.character(temp$X5),as.character(temp$X6),
               as.character(temp$X7),as.character(temp$X8))
  , n =  c(rep(as.character(tmls_el$n),8)))

注意:它与你给出的例子一起工作,如果你有超过8个目标,你必须将数字2更改为2,3,...k,并将新列粘贴到Target中,并重复k次Source和 n。当然有更优雅的方法,但这很有效。

这里可以创建边和节点:

library(dplyr)
el <- tmls_el_2 %>% filter(Target !='')
no <- data.frame(name = unique(c(as.character(el$Source),as.character(el$Target))))

现在您可以使用 igraph 绘制结果:

library(igraph)
g <- graph_from_data_frame(el, directed=TRUE, vertices=no)
plot(g, edge.width = el$n/2)


有数据:

tmls_el <- data.frame(Source = c("legasalvini","legasalvini","legasalvini","legasalvini","legasalvini","legasalvini","movimento5stelle"),
                      Target = c("circomassimo","1giornodapecora","24mattino","agorarai","ariachetira","c(\"raiportaaporta\", \"brunovespa\")","c(\"test1\", \"test2\", \"test3\", \"test4\", \"test5\", \"test6\", \"test7\", \"test8\")"),
                      n = c(2,2,2,28,26,7,20))