2

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

我使用 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 
```
4

1 回答 1

2

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

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,并将新列粘贴到目标中,并重复 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))
于 2019-11-22T13:47:09.273 回答