gpt4 book ai didi

r - 来自大型数据框的共现

转载 作者:行者123 更新时间:2023-12-04 10:46:50 25 4
gpt4 key购买 nike

我有一个数据框,其中包含有关每个用户访问过哪些城市的信息:

df.visited <- data.frame(user  = c("john","john", 
"claire", "claire",
"doe","doe"),
city = c('Antananarivo', 'Barcelona',
'Caen', 'Dijon',
'Antananarivo', 'Caen'))

我想创建一个共同访问图表。为此,我需要一个邻接矩阵(用户 x 用户)或边列表(usera、userb、#co-visits)

我可以对小型数据集执行此操作:

by_user_city <- table(df.visited)    

# city
#user Antananarivo Barcelona Caen Dijon
#claire 0 0 1 1
#doe 1 0 1 0
#john 1 1 0 0

adjacency <- by_user_city %*% t(by_user_city)

# user
#user claire doe john
#claire 2 1 0
#doe 1 2 1
#john 0 1 2

edges <- melt(adjacency)

# user user value
#1 claire claire 2
#2 doe claire 1
#3 john claire 0
#4 claire doe 1
#5 doe doe 2
#6 john doe 1
#7 claire john 0
#8 doe john 1
#9 john john 2

对于一个拥有超过 300,000 个用户的 1.5M 访问日志的大型数据集,表命令会报错:

Error in table(df.visited) : 
attempt to make a table with >= 2^31 elements

那么,我怎样才能在不耗尽内存的情况下获得共同访问的边呢?

最佳答案

鉴于您的数据量,我建议您使用 Java 图数据库 neo4j。前 neo4j 员工 Nicole White 为它做了一个 R 包,RNeo4j .我在 2014 年这样做是为了在一个非常大的公司社交网络上建立大量实时分析,并且效果很好。

您也可以让它与其他一些图形数据库一起使用,但这是我所知道的,我认为它可能是最受欢迎的。

以下是我看到的步骤:

  1. Download Neo4j
  2. install.packages("RNeo4j")
  3. 连接:graph = startGraph("http://localhost:7474/db/data/")
  4. 使用transactional endpoint加载数据
  5. 使用Cypher查询结果

如果您想更清楚地了解#4 和#5,可以使用old post。有人问如何使用 R 扩展将数据加载到 neo4j 中,White 回答了如何使用事务端点和查询结果的示例。当然,如果您愿意,也可以在 R 之外加载它。

这也解决了您 future 可能遇到的许多问题,例如如何可视化社交图、对您的网络/论坛进行各种不同的查询、处理不断增加的大小等等。您不应该遇到内存问题方式,因为它确实针对规模进行了精心设计。

您可以使用像 igraphggnet 这样的图形包,将内存密集型部分保留在图形数据库中:

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)

enter image description here

关于r - 来自大型数据框的共现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39440665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com