【发布时间】:2021-08-21 18:11:00
【问题描述】:
我真的尽力通过 stackoverflow 搜索解决方案,但不幸的是我找不到合适的问题。因此,我必须自己提出一个问题。
我正在处理一个包含 sessionID 和主题的数据集。想象一下它看起来像这样:
sessionID <- c(1, 2, 2, 3, 4, 4, 5, 6, 6, 6)
topic <- c("rock", "house", "country", "rock", "r'n'b", "pop", "classic", "house", "rock", "country")
transactions <- cbind(sessionID, topic)
transactions
现在,我想知道某个主题有多少个项目一起出现在一个会话中。最后,我想获得一个矩阵,表示特定主题与其他主题的会话频率。最终结果应如下所示:
topics <- sort(unique(topic))
topicPairs <- matrix(NA, nrow = length(topics), ncol = length(topics))
colnames(topicPairs) <- topics
rownames(topicPairs) <- topics
topicPairs["house", "country"] <- 2
topicPairs["country", "house"] <- 2
topicPairs["r'n'b", "pop"] <- 1
topicPairs["pop", "r'n'b"] <- 1
topicPairs["rock", "house"] <- 1
topicPairs["house", "rock"] <- 1
topicPairs["rock", "country"] <- 1
topicPairs["country", "rock"] <- 1
topicPairs["house", "house"] <- 2
topicPairs
例如,在“house”行中,“country”列应该等于 2,因为“house”在第 2 和 6 次会话中与“country”一起出现。
我希望在主对角线上,一个主题在会话中出现的频率。在这里,行“house”列“house”等于 2,因为它已经在两个会话中......但我不确定。
如果您的解决方案不包含循环,那就太棒了,因为我的数据集非常大。因此,我更喜欢 tidyverse 中的函数(dplyr、tidyr 等)。也许是 group_by 和 tidyr 包中的 spread 函数的组合。
我真的在寻找你的答案。非常感谢您!
亲切的问候!
【问题讨论】:
-
试试类似:
crossprod(table(as.data.frame(transactions)))? -
嘿,本!工作完美!非常感谢您的快速答复! :)
标签: r dplyr tidyverse tidyr data-wrangling