R 来自大型数据帧的共现
我有一个数据框,其中包含每个用户访问过哪些城市的信息:R 来自大型数据帧的共现,r,R,我有一个数据框,其中包含每个用户访问过哪些城市的信息: df.visited <- data.frame(user = c("john","john", "claire", "claire", "doe","doe"), city = c('Antananarivo', 'Barcelona',
df.visited <- data.frame(user = c("john","john",
"claire", "claire",
"doe","doe"),
city = c('Antananarivo', 'Barcelona',
'Caen', 'Dijon',
'Antananarivo', 'Caen'))
那么,如何在不耗尽内存的情况下获取共同访问边呢?尝试此操作以避免使用表函数
library(tidyr)
df.visited$val<-1
spread(df.visited,city,val,fill=0)
library(tidyr)
鉴于数据的大小,我建议您使用Java图形数据库neo4j。neo4j的前雇员Nicole White为其制作了一个R包。我在2014年这样做是为了在一个非常大的公司社交网络上建立很多实时分析,而且效果很好
您也可以使它与其他一些图形数据库一起工作,但这是我所知道的一个,我认为它可能是最流行的
以下是我看到的步骤:
Neo4j
install.packages(“RNeo4j”)
连接:
graph=startGraph(“http://localhost:7474/db/data/“”
使用来加载数据
使用Cypher查询结果
如果您想更清楚地了解#4和#5,有人问如何使用R将数据加载到neo4j中,White给出了如何使用事务端点和查询结果的示例。当然,如果您愿意,也可以在R之外加载它
这也解决了你将来可能遇到的许多问题,比如如何可视化社交图,如何在你的网络/论坛上进行各种不同的查询,如何处理不断增加的大小等等。你不应该以这种方式遇到内存问题,因为它确实是为规模而精心设计的
您可以使用诸如igraph
和ggnet
之类的绘图包,将内存密集型部分保留在图形数据库中:
library(igraph)
query = "
MATCH (n)-->(m)
RETURN n.name, m.name
"
edgelist = cypher(graph, query)
ig = graph.data.frame(edgelist, directed=F)
betweenness(ig)
plot(ig)
说到igraph
——不妨试试:
library(igraph)
g <- graph_from_data_frame(df.visited)
V(g)$type <- bipartite.mapping(g)$type
g2 <- bipartite.projection(g)$proj1
as_data_frame(g2, "edges") %>% head
# from to weight
# 1 john doe 1
# 2 claire doe 1
库(igraph)
g谢谢盛林。但不幸的是错误:无法分配大小为288.3 Gb的向量
我认为我们应该避免使用正则矩阵。谢谢Hack-R。但是我希望使用R(igraph)中的图形因为我想应用一些算法,比如社区检测。@alberto在软件包页面上有关于如何使用igraph
和Rneo4J
的说明。就像这个库(igraph);query=“匹配(n)-->(m)返回n.name,m.name”;edgelist=cypher(图形、查询);ig=图形数据帧(边列表,定向=F);介数(ig);plot(ig)
几乎在那里:在vector。pmt:439:无法为vector保留空间,内存不足
但看起来我可能可以释放一些内存或在小型服务器上运行它。我明天会试试,但我想我会送你一些啤酒。顺便说一句,最后一行说,as.data.frame(g2,“edges”)%%>%as.data.frame.default(g2,“edges”):无法将类“igraph”强制为data.frame
你使用的是哪个igraph版本?我使用的是packageVersion(“igraph”)
'1.0.1'
。啤酒总是受欢迎的:-)也许,尝试一下稀疏的替代品--crossprod(sparseMatrix(i=as.integer(df.visted$city),j=as.integer(df.visted$user),x=1L,dimnames=rev(sapply(df.visted,levels))
library(igraph)
query = "
MATCH (n)-->(m)
RETURN n.name, m.name
"
edgelist = cypher(graph, query)
ig = graph.data.frame(edgelist, directed=F)
betweenness(ig)
plot(ig)
library(igraph)
g <- graph_from_data_frame(df.visited)
V(g)$type <- bipartite.mapping(g)$type
g2 <- bipartite.projection(g)$proj1
as_data_frame(g2, "edges") %>% head
# from to weight
# 1 john doe 1
# 2 claire doe 1