Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 来自大型数据帧的共现_R - Fatal编程技术网

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