【问题标题】:Create a co-occurrence matrix from a .csv从 .csv 创建一个共现矩阵
【发布时间】:2017-07-28 18:48:36
【问题描述】:

我正在尝试创建一个共现矩阵,以查看哪些关键字在我的数据库中经常关联在一起。

数据看起来像这样,它是一个 .csv 文件。

id,    keywords
1,     apple;pear
2,     apple;cherry
3,     pear;cherry
4,     apple;cherry

我想得到这样的东西

          apple  pear  cherry
apple       0      1      2
pear        1      0      1
cherry      2      1      0

然后目标是使用 d3.js 来可视化矩阵。

我已经在R 标签中发布了这个,因为我以前在一些课程中使用过它,所以我不是一个完整的新手。我在寻找解决方案时看到也可以使用 python 来执行此操作,但我一生中从未接触过它。

【问题讨论】:

  • 我发现 this way 这样做似乎非常适合我想做的事情!

标签: r matrix


【解决方案1】:

您可以使用tidyr(和magrittr)包和table函数。

library(tidyr)
library(magrittr)
df <- data.frame(id = 1:4, keywords = c("apple;pear", "apple;cherry", "pear;cherry", "apple;cherry"))

df2 <- df %>% separate(keywords, sep = ";", into = c("F1", "F2"))

这是为了在您的行/列名称中包含正确的级别。

df2$F1 %<>% factor() 
df2$F2 %<>% factor()

df2$F1 <- factor(df2$F1, levels = unique(c(levels(df2$F1), levels(df2$F2))))
df2$F2 <- factor(df2$F2, levels = unique(c(levels(df2$F1), levels(df2$F2))))

您现在可以使用表格(它不是对称的,所以使用+

> table(df2$F1, df2$F2) + table(df2$F2, df2$F1)

         apple pear cherry
  apple      0    1      2
  pear       1    0      1
  cherry     2    1      0

【讨论】:

  • df &lt;- data.frame(id = 1:4, keywords = c("apple;pear", "apple;cherry", "pear;cherry", "apple;cherry")) 必须手动输入关键字吗?在我的数据框中,我有超过 200 个,所以会有点复杂。
  • 哦不,这只是为了使用您的示例。为此使用read.csv
  • 嘿,它工作正常,但问题是我没有正确地问我的问题。我让它看起来每行只有 2 个关键字,但这个数字可以改变。有时你有一个关键字,有时是四个,等等。所以into = c("F1", "F2")) 在这里不是正确的解决方案。 @MrSnake
  • 而且您使用因子的行似乎也存在问题,它将NA 放在矩阵中的任何位置。即使使用您提供的示例代码。我错过了什么吗?
  • 是的,你是对的,3个字或更多,它不能工作。然而,我开始了一个新的 R 会话,代码工作并给出了我写的输出。
猜你喜欢
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2020-03-21
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 2019-02-15
相关资源
最近更新 更多