从dplyr分组数据创建igraph图

从dplyr分组数据创建igraph图,r,dplyr,igraph,R,Dplyr,Igraph,我的目标是创建一个igraph对象,以后可以使用它来绘制ggraph 我的数据是发票,每个发票包含不同数量的项目。n是原始样本中恰好出现一张发票的次数。例如,在以下发票类型1中,包括面包、黄油和鸡蛋,已开具10次发票 #library(tidyverse) data <- tibble(invoicetype = c(1,1,1,2,2,3,3,4,4,4,4,4,5,5,6,7,7,8,8,8,9,9), item = c("bread", "butter

我的目标是创建一个igraph对象,以后可以使用它来绘制ggraph

我的数据是发票,每个发票包含不同数量的项目。n是原始样本中恰好出现一张发票的次数。例如,在以下发票类型1中,包括面包、黄油和鸡蛋,已开具10次发票

#library(tidyverse)
data <- tibble(invoicetype = c(1,1,1,2,2,3,3,4,4,4,4,4,5,5,6,7,7,8,8,8,9,9), 
               item = c("bread", "butter", "eggs", "bread", "coke", "coke", "eggs", 
                        "bread", "butter","coke", "pasta", "water", "coke", "water", 
                        "coke", "bread", "butter", "eggs", "coke", "water", "pasta", 
                        "bread"),
               n = c(10,10,10,8,8,7,7,4,4,4,4,4,3,3,3,2,2,1,1,1,1,1))
#库(tidyverse)
数据%
总结(项目1=项目[1],项目2=项目[2],项目3=项目[3],
项目4=项目[4],项目5=项目[5])
组合%pull(),
invoicetype=数据分布[g,1]]>%pull(),
n=数据分布[g,2]>%pull())
}
}
}
组合%
distinct()%>%#删除重复计数的
过滤器(!is.na(from),!is.na(to))%>%#删除空组合
分组依据(从,到)%>%
总结(n=总和(n))%>%
解组()
#图书馆(igraph)

g如果您只将数据连接到自身,则可以节省大量时间。许多边缘列表遵循这种类型的工作流程:

combo <- data %>%
  #join the data to itself
  left_join(data, by = c('invoicetype', 'n')) %>%
  #this is undirected so x %--% y is the same as y %--% x
  filter(item.x < item.y) %>%
  group_by(item.x, item.y) %>%
  summarize(n = sum(n))
组合%
#将数据连接到自身
左联合(数据,by=c('invoicetype','n'))%>%
#这是无向的,因此x%--%y与y%--%x相同
过滤器(项目x<项目y)%>%
分组依据(项目x、项目y)%>%
汇总(n=总和(n))
情节是这样的

g <- graph_from_data_frame(combo2, directed = F)

g_strength <- strength(g, weights = E(g)$n)

set.seed(1234)
plot(g,
     edge.width = E(g)$n/max(E(g)$n) * 10,
     vertex.size = g_strength/max(g_strength) * 20)

g如果您只需将数据连接到自身,就可以节省大量时间。许多边缘列表遵循这种类型的工作流程:

combo <- data %>%
  #join the data to itself
  left_join(data, by = c('invoicetype', 'n')) %>%
  #this is undirected so x %--% y is the same as y %--% x
  filter(item.x < item.y) %>%
  group_by(item.x, item.y) %>%
  summarize(n = sum(n))
组合%
#将数据连接到自身
左联合(数据,by=c('invoicetype','n'))%>%
#这是无向的,因此x%--%y与y%--%x相同
过滤器(项目x<项目y)%>%
分组依据(项目x、项目y)%>%
汇总(n=总和(n))
情节是这样的

g <- graph_from_data_frame(combo2, directed = F)

g_strength <- strength(g, weights = E(g)$n)

set.seed(1234)
plot(g,
     edge.width = E(g)$n/max(E(g)$n) * 10,
     vertex.size = g_strength/max(g_strength) * 20)

g我通常会根据类似情况定制类似的东西

库(tidyverse)
数据%
mutate(item2=item)%>%#创建第二个item列
分组依据(发票类型)%>%
展开(项、项2、嵌套(n))%>%#获取组中的所有组合
解组()%>%
过滤器(项目!=项目2)%>%#丢弃循环
mutate(from=map2_chr(item,item2,min),#对于无向的,对二元的名称进行排序。。。
to=map2_chr(项目,项目2,最大值))%>%\。。。按字母顺序
distinct(from,to,n)%>%#删除重复的行和未使用的列
分组依据(从,到)%>%
总结(权重=总和(n))%>%
解组()
#>#A tibble:14 x 3
#>体重
#>         
#>1面包黄油16
#>2面包可乐12
#>3个面包蛋10个
#>4面包面食5
#>5面包水4
#>6黄油可乐4
#>7个黄油蛋10个
#>8黄油面食4
#>黄油水
#>10个可乐蛋8个
#>11可口可乐面食4
#>12可乐水8
#>13个鸡蛋水1
#>14意大利面水4

我通常会根据类似情况定制类似的东西

库(tidyverse)
数据%
mutate(item2=item)%>%#创建第二个item列
分组依据(发票类型)%>%
展开(项、项2、嵌套(n))%>%#获取组中的所有组合
解组()%>%
过滤器(项目!=项目2)%>%#丢弃循环
mutate(from=map2_chr(item,item2,min),#对于无向的,对二元的名称进行排序。。。
to=map2_chr(项目,项目2,最大值))%>%\。。。按字母顺序
distinct(from,to,n)%>%#删除重复的行和未使用的列
分组依据(从,到)%>%
总结(权重=总和(n))%>%
解组()
#>#A tibble:14 x 3
#>体重
#>         
#>1面包黄油16
#>2面包可乐12
#>3个面包蛋10个
#>4面包面食5
#>5面包水4
#>6黄油可乐4
#>7个黄油蛋10个
#>8黄油面食4
#>黄油水
#>10个可乐蛋8个
#>11可口可乐面食4
#>12可乐水8
#>13个鸡蛋水1
#>14意大利面水4

我喜欢您使用的
展开
方法。这是一个很好的选择,而不仅仅是
left\u join
Ing。我认为使用expand更干净,而且我通常会创建一个单独的二元列表列用于排序。也就是说,如果数据很大,那么
left\u-join
ing会明显更快。我喜欢你使用的
expand
方法。这是一个很好的选择,而不仅仅是
left\u join
Ing。我认为使用expand更干净,而且我通常会创建一个单独的二元列表列用于排序。这就是说,如果数据很大,左键连接的速度会明显加快。