R网络图

时间:2016-06-03 12:19:17

标签: r networking graph

我有数据,其中X-column正在审核,然后是大多数评论所拥有的单词列。是否可以创建一个图表,其中节点将是评论,边缘将是单词?

X action age ago amazing american art author back bad beautiful beginning
1   1     1   0    0        0      0    0     0    0     0         0
2   0     0   0    0        0      0    0     0    0     0         0
3   0     0   0    0        0      0    0     0    1     0         0
4   1     3   0    0        0      2    1     0    0     0         0
5   0     0   1    0        1      0    0     2    0     1         0

另一个想法是根据使用的单词及其频率对图表中的评论进行攻击。

非常感谢你。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

使用您的示例数据,可以创建包含节点(每个评论)和边缘的图形(两个评论在使用相同的单词时连接)。此外,您可以根据两个评论共有多少单词对边缘进行加权,而且您可以使用不同的边缘形状/颜色来表示不同的单词。

有几种方法可以使用您的数据创建图表。首先,创建一个邻接矩阵,其中每个列和每行代表一个评论。 adjecency矩阵只计算两次评论之间是否有共同词。如果两个评论共享一个共同的单词,则取值为1,否则为零。

adjency矩阵看起来与此类似,后者表示列和行标签:

 Review A B C D 
    A   0 1 1 1 
    B   1 0 0 1   
    C   1 0 0 1   
    D   1 1 1 0

使用igraph包中的R命令graph_from_adjency(),您可以创建图形并使用绘图函数。

其次,您还可以创建一个权重矩阵,用于计算两次审核之间共享的单词数量。使用igraph包中的相同命令graph_from_adjency(,weighted = T),您可以从该矩阵创建图形。 您可以在此处找到有关igraph包的网络分析的详细介绍:http://kateto.net/networks-r-igraph

  Review A B C D 
    A   0 2 3 1 
    B   2 0 0 2   
    C   3 0 0 2   
    D   1 2 2 0

第三,您可以从边缘和节点数据帧中指定图形。

节点数据框将包含每个节点的短标识,可能包含您可能希望包含的有关节点的名称和所有其他信息:

 id long_review_name 
  R1       A
  R2       B 
  R3       C
  R4       D

边缘数据框收集有关两个评论之间连接的所有信息。首先,最重要的是它会记录列中的所有边缘。此外,它可以包含频率作为边缘上的权重,类型将表示两个节点共享哪个字连接:

 from   to  weight  type 
  R1    R2    1   american
  R1    R2    1   age
  R1    R3    2   american
  R1    R3    1   age 
  R1    R4    1   age 
  R2    R4    2   american

要将边和节点数据框转换为图形,您需要使用命令graph_from_data_frame(d = links,vertices = nodes)。

答案 1 :(得分:1)

以下是探索数据关系的三种方法:

par(mfrow=c(1,3))

# two mode network (reviews+words)
library(igraph)
set.seed(1)
g <- graph_from_data_frame(subset(reshape2::melt(df, 1), !!value, -value)[2:1])
V(g)$type <- bipartite.mapping(g)$type 
plot(g, layout = layout_as_bipartite(g)[, 2:1], vertex.color = V(g)$type+1L)

# just the reviews:
library(reshape2)
lst <- with(subset(melt(df, 1), !!value)[2:1], split(X, variable))
lst <- lst[lengths(lst)>1]
lst <- lapply(lst, function(x) t(combn(x, m=2)))
g <- graph_from_edgelist(do.call(rbind, lst), dir = F)
E(g)$label <- rep(names(lst), sapply(lst, nrow))
plot(g)

# review clustering
df[-1] %>% dist(meth="bin") %>% hclust %>% plot

<强>输出:

enter image description here

数据:

df <- read.table(header=T, text="
X action age ago amazing american art author back bad beautiful beginning
1   1     1   0    0        0      0    0     0    0     0         0
2   0     0   0    0        0      0    0     0    0     0         0
3   0     0   0    0        0      0    0     0    1     0         0
4   1     3   0    0        0      2    1     0    0     0         0
5   0     0   1    0        1      0    0     2    0     1         0")

PS:可能有一条捷径。 2(评论为节点和单词作为边缘) - 随意添加它。