我正在尝试从Wikipedia Clickstream数据集创建一个转换矩阵。借此,我想展示用户从一篇维基百科文章转移到另一篇维基百科文章的可能性。
我有一个数据框,由三列组成。 source.category是指源文章的标题,而target.category是指目标文章的标题。第三列是“总计”,指的是点击次数(即用户从该来源文章移至目标文章的次数)。
据此,我想计算在给定点击次数的情况下从源文章到目标文章的转换概率。
这是我的数据框的摘要:
source.category target.category total
Length:98 Length:98 Min. : 21
Class :character Class :character 1st Qu.: 684
Mode :character Mode :character Median : 2132
Mean : 5395
3rd Qu.: 5296
Max. :53378
最好的方法是创建一个函数吗?
trans.matrix <-function(...)
此功能的外观如何?
然后将其放入:trans.matrix(as.matrix(df))吗?
答案 0 :(得分:0)
我将使用key
软件包进行此操作。我创建了一个最小的数据集来说明这一点:
reshape2
然后仅使用set.seed(42)
dataset <- expand.grid(letters[1:4], LETTERS[1:4])
dataset$total <- rpois(16, 1)
names(dataset) <- c("source.category", "target.category", "total")
# set the last row to the first row to illustrate fill and aggregate
dataset[16, ] <- dataset[1, ]
函数创建矩阵,最后将行总和标准化为1。
acast
编辑:在较大的数据集上,这将永远甚至失败。对于较大的数据集,请使用require(reshape2)
# reshape to wide format
res <- acast(
dataset, # the dataset
source.category ~ target.category, # the margins of the result
value.var = "total", # which variable should be in the cells
fill=0L, # fill empty cells with this value
fun.aggregate = sum # aggregate double cells with this function
)
# normalize rowSums to 1
res <- res / rowSums(res)
# this is your result
res
包中的稀疏矩阵,这样做速度更快,并且存储结果也更小。
Matrix
这在整个数据集上足够快,可以交互工作。