r - 当存在包含多个用户的观察时,如何为推文中提到的每个用户创建一个边缘列表
问题描述
我想对我感兴趣的一些用户的推文以及他们推文中提到的用户的推文进行网络分析。
我使用 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
,并将新列粘贴到目标中,并重复 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))
推荐阅读
- php - 网站阻止来自我的虚拟主机和本地主机的 PHP CURL 调用,但不阻止来自其他主机的 PHP CURL 调用
- linux - 获取 Job id 并将它们放入 bash 命令
- c++ - 调用原子的store()时可以调用基类型类的函数吗?C++
- java - 如何从使用 maven 程序集创建的 jar 中排除 javafx 依赖项?
- python-3.x - 将python中一列元组的相等元组提取到新数据集
- flutter - 如何在 Flutter 中向 ListTile 添加自定义波纹效果颜色
- sql - 为什么我不能返回我在函数参数 PL SQL 中传递的值
- java - 在构造函数中使用 lambda 时的“this”引用转义
- python - flask login_required 装饰器位置 - 从头开始编写
- android - itemClickListener 无法使用数据绑定