360SDN.COM

R语言︱SNA-社会关系网络 R语言实现专题(基础篇)(二)

来源: 素质云笔记  2017-07-28 11:58:46    评论:0点击:

笔者寄语:这里所有的应用代码都来自与igraph包。《R语言与网站分析》书中第九章关系网络分析把大致的框架已经描述得够清楚,但是还有一些细节需要完善,而且该书笔者没找到代码。。

 


 

一些基本操作

 

关系网络中,每一个点的信息存放在V中,每一个线的信息存放在E中。并且通过自编译的init.igraph函数,V(g)$label以及E(g)$weight都是自带的属性。

可以生成一个空的关系网络。

并且关系网络生成之后,R里面就不是用真实的名字来做连接,是采用编号的。例如(小明-小红)是好朋友,在R里面就显示为(1-2),所以需要单独把名字属性加到序号上。

 

g<-graph.empty(directed=F)  

 

1、关系网络中的点集V

 

点集就是网络中所有的点,如有向文本型那个数据格式,包括了14个点;7条线。

 

(1)点集属性

 

点集与数据框的操作很相似,属性是可以自己赋上去的,比如V(g)$label就是赋上去的,你还可以给点集加上颜色(V(g)$color)、加上每个点的尺寸(V(g)$size),加上分类(V(g)$member)

点集的选择跟数据框操作一样,比如我要选择群落为1的点集,就是V(g)[which(V(g)$member==1)]

比如我要选择点度数大于1的点集,V(g)[degree(g)>1]

如果我想知道一下这两个点之间是否有关系,可以用edge.connectivit函数,edge.connectivity(g, 4,9)  代表着第四个点与第九个点之间是否有连接关系。返回的0/1。0是没有线,1代表有线。

 

(2)点集加减操作

 

我想在原来的基础上加入一些点,用add.vertices

g<-add.vertices(g,length(labels))#关系网络中加入“点”  

 

g<-g-V(g)[degree(g)==0]   

如果我想减去点度数为0的点

 

 

 

(3)相邻点的集合——neighbors(很重要)

 

neighbors(g.zn,v=which(V(g.zn)$label=="会计"))  

V(g.zn)$label[neighbors(g.zn,v=which(V(g.zn)$label=="取向"),mode="total")]  

   #默认mode设置是out,还有 in,total;其中V(g.zn)$label和V(g.zn)一个返回标签,一个返回值  

 

 

eighbors可以找出标签如果是“会计”的点,与之有关系的点的序号是啥;不过你也可以通过V(g.zn)$label让临近点的标签一起筛选出来

其中mode代表点出度(out)以及点入度(in),还有两个都有的点度(total)。

该函数可以对于点集,做附近的画像,比较好用。

 

 

2、关系网络中的线集E

 

(1)线集的类型

 

关系网络中线的关系比较多,loop线就是循环到自己的点,1-2-1;multiple代表线的重叠。

which_loop(g)  #线是否能够指回自己,1-1就是指回自己  

which_multiple(g)  #是否有重复线,后面1-1与前面1-1重复了  

 

(2)线集属性

 

线的属性中,自编译函数能够拿到线权重,E(g)$weight。但是没有标签项,这时候需要用set_vertex_attr加入线标签。

[html] view plain copy print?在CODE上查看代码片派生到我的代码片

g<-set_vertex_attr(g,"name",value=V(g)$label)  

原理就是把点集的标签,打到线集上来,name是默认的设置。

线集的属性中也可以跟数据集一样进行筛选操作。

 

temp<-E(g)[order(E(g)$weight>25000)]  

 

(3)线集加减

 

线集的加减可以用add.edges以及-来实现

g<-add.edges(g,t(edges))  #edges需要先转置  

g<-g-E(g)[(weight>1)]  #删除部分线  

 

其中需要注意,add.edges中,需要把列数据,转置为行数据,平放id与词条。

同时线集也会有重复性的问题,见下文count.multiple(g) 以及simplify函数。

还有一些特别的函数,diameter(g)可以做到最长的链接经过了多少根线。

 

4、关系网络的重复性问题

 

在关系网络中,重复是常见的,而且无向线中1-2与2-1是重复的,重复线的数量也可以作为线的权重。也就是E(g)$weight。其中igrarh包中笔者看到两个函数跟重复性问题有关。count.multiple(g) 以及simplify函数。

 

(1)count.multiple(g) 函数

 

可以获得网络中线的重复情况。不重复是1,重复一次+1。比如:无向网络(1-2,2-3,2-1)就是(2,1,2)

等价于E(g)$weight

 

(2)simplify函数

 

函数常规式:simplify(g,remove.multiple = TRUE,remove.loops = TRUE,edge.attr.comb = "mean")

其中loops是指是否循环回自己,比如1-2-1就是一个循环到自己;multiple是指重复比如1-2,2-1。

h <- graph( c(1,2,1,2,3,3,2,1,4,4) );h     

is_simple(h)  

simplify(h, remove.loops=FALSE)   #线重复,删除a->b,a->b删掉  

simplify(h, remove.loops=TRUE)    #在线方向性重复基础上删掉点重复,a->a,b->b  

simplify(h, remove.multiple=FALSE)#删掉点重复  

simplify(h, remove.multiple=TRUE)#删掉点重复同时,删除线a->b,a->b  

simplify(h, remove.multiple=TRUE,remove.loops=TRUE) #删掉线重复、点重复  

 

simplify函数识别了两种重复方式,一种是线重复,比如1-2,2-1,;一种是点重复比如1-1,2-2就是点重复。

remove.multiple=TRUE,把重复的线删除

edge.attr.comb,使用重复次数来更新线权重E(g)$weight

为您推荐

友情链接 |九搜汽车网 |手机ok生活信息网|ok生活信息网|ok微生活
 Powered by www.360SDN.COM   京ICP备11022651号-4 © 2012-2016 版权