每个节点及其网络的 igraph 计算指标
igraph compute metrics for each node and its network
我很好奇如何为每个节点计算一些指标。
为每个节点计算
的欺诈连接百分比
直接节点(定向)
直接节点(无向)
来自节点的友情网络(定向)
来自节点的友谊网络(无向)
总计和每种关系类型。
开始使用 igraph 我不确定如何继续编写自己的图形处理函数(即不仅应用学位、pagerank 等)。期待一些建议,仅通过一次图表即可解决此任务。
这里是最小样本
library(igraph)
id = c("a", "b", "c", "d", "e", "f", "g")
name = c("Alice", "Bob", "Charlie", "David", "Esther", "Fanny", "Gaby")
fraud = c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)
verticeData <- data.frame(id, name, fraud)
verticeData
src <- c("a", "b", "c", "f", "e", "e", "d", "a")
dst <- c("b", "c", "b", "c", "f", "d", "a", "e")
relationship <-c("A", "B", "B", "B", "B", "A", "A", "A")
edgeData <- data.frame(src, dst, relationship)
edgeData
g <- graph_from_data_frame(edgeData, directed = TRUE, vertices = verticeData)
plot(g, vertex.color=V(g)$fraud)
# TODO compute metrics
我没有移动的权限,因此将根据 https://stats.stackexchange.com/questions/256859/igraph-compute-metrics-for-each-node-and-its-network
的评论手动移动
sna
包中的 gapply
函数为计算各种自我网络统计数据提供了很大的灵活性。它的功能或多或少类似于 apply
函数族,但特别是在网络邻居上循环。 intergraph
包使 igraph
和 sna
之间的转换变得容易。
library(sna)
net<-intergraph::asNetwork(g)
c <- c(1,2)
funcs <- c(sum,mean)
for (i in funcs){
for (j in list(1,2,c)){
print(gapply(net,j,net %v% "fraud",i))
}
}
gapply
使用起来不是很直接。第二个参数 ("MARGIN") 表示 row-wise(传出关系)、column-wise(传入关系)或两者(即无向)。第三个参数是要计算的统计向量,第四个参数是您要使用的函数。如您所愿,第三个和第四个参数有很大的灵活性。
> gapply(net,c(1,2),net %v% "fraud",sum)
[1] 0 1 0 1 1 0 0
> gapply(net,c(1),net %v% "fraud",sum)
Alice Bob Charlie David Esther Fanny Gaby
0 0 0 1 0 0 0
> gapply(net,c(2),net %v% "fraud",sum)
Alice Bob Charlie David Esther Fanny Gaby
0 1 0 0 1 0 0
我很好奇如何为每个节点计算一些指标。
为每个节点计算
的欺诈连接百分比直接节点(定向)
直接节点(无向)
来自节点的友情网络(定向)
来自节点的友谊网络(无向)
总计和每种关系类型。
开始使用 igraph 我不确定如何继续编写自己的图形处理函数(即不仅应用学位、pagerank 等)。期待一些建议,仅通过一次图表即可解决此任务。
这里是最小样本
library(igraph)
id = c("a", "b", "c", "d", "e", "f", "g")
name = c("Alice", "Bob", "Charlie", "David", "Esther", "Fanny", "Gaby")
fraud = c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)
verticeData <- data.frame(id, name, fraud)
verticeData
src <- c("a", "b", "c", "f", "e", "e", "d", "a")
dst <- c("b", "c", "b", "c", "f", "d", "a", "e")
relationship <-c("A", "B", "B", "B", "B", "A", "A", "A")
edgeData <- data.frame(src, dst, relationship)
edgeData
g <- graph_from_data_frame(edgeData, directed = TRUE, vertices = verticeData)
plot(g, vertex.color=V(g)$fraud)
# TODO compute metrics
我没有移动的权限,因此将根据 https://stats.stackexchange.com/questions/256859/igraph-compute-metrics-for-each-node-and-its-network
的评论手动移动sna
包中的 gapply
函数为计算各种自我网络统计数据提供了很大的灵活性。它的功能或多或少类似于 apply
函数族,但特别是在网络邻居上循环。 intergraph
包使 igraph
和 sna
之间的转换变得容易。
library(sna)
net<-intergraph::asNetwork(g)
c <- c(1,2)
funcs <- c(sum,mean)
for (i in funcs){
for (j in list(1,2,c)){
print(gapply(net,j,net %v% "fraud",i))
}
}
gapply
使用起来不是很直接。第二个参数 ("MARGIN") 表示 row-wise(传出关系)、column-wise(传入关系)或两者(即无向)。第三个参数是要计算的统计向量,第四个参数是您要使用的函数。如您所愿,第三个和第四个参数有很大的灵活性。
> gapply(net,c(1,2),net %v% "fraud",sum)
[1] 0 1 0 1 1 0 0
> gapply(net,c(1),net %v% "fraud",sum)
Alice Bob Charlie David Esther Fanny Gaby
0 0 0 1 0 0 0
> gapply(net,c(2),net %v% "fraud",sum)
Alice Bob Charlie David Esther Fanny Gaby
0 1 0 0 1 0 0