【发布时间】:2017-01-19 07:43:19
【问题描述】:
我有一个数据框,其中包含有关每个用户访问过哪些城市的信息:
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 个用户的 150 万次访问日志的大型数据集,table 命令会报错:
Error in table(df.visited) :
attempt to make a table with >= 2^31 elements
那么,我怎样才能在不耗尽内存的情况下获得共同访问边缘?
【问题讨论】:
-
也许,尝试一个稀疏的替代方案 --
crossprod(sparseMatrix(i = as.integer(df.visited$city), j = as.integer(df.visited$user), x = 1L, dimnames = rev(sapply(df.visited, levels))))
标签: r