【问题标题】:How to create an adjacency matrix from raw data which is non-numeric in nature [duplicate]如何从本质上非数字的原始数据创建邻接矩阵[重复]
【发布时间】:2013-07-08 11:14:16
【问题描述】:

我正在处理的输入示例如下:

User ID 1 --- Artist 5
User ID 2 --- Artist 1
User ID 3 --- Artist 7
User ID 4 --- Artist 2
User ID 5 --- Artist 3
User ID 1 --- Artist 2
User ID 3 --- Artist 1

以上数据是应用用户听过的音乐记录。

我想生成一个与下面给出的示例对应的邻接矩阵:

           ARTIST 1  ARTIST 2  ARTIST 3  ARTIST 4   ARTIST 5  ARTIST 6  ARTIST 7
USER ID 1     0        1         0          0         1         0         0
USER ID 2     1        0         0          0         0         0         0
USER ID 3     1        0         0          0         0         0         1
USER ID 4     0        1         0          0         0         0         0
USER ID 5     0        0         1          0         0         0         0

这在 R 中是如何实现的。任何提示或指针将不胜感激。

提前感谢您的时间和帮助。

【问题讨论】:

  • 我建议在此添加“r”标签以接触 r 专家
  • 谢谢doctorlove...会加标签
  • 只需在您的数据中添加一列1 并使用上面的答案。
  • 谢谢。这是个好主意。

标签: r adjacency-matrix


【解决方案1】:

如果DF是题中数据对应的两列数据框则:

xtabs(data = DF)

给出:

           V2
V1          Artist 1 Artist 2 Artist 3 Artist 5 Artist 7
  User ID 1        0        1        0        1        0
  User ID 2        1        0        0        0        0
  User ID 3        1        0        0        0        1
  User ID 4        0        1        0        0        0
  User ID 5        0        0        1        0        0

注意:我们将其用于输入:

DF <- structure(list(V1 = structure(c(1L, 2L, 3L, 4L, 5L, 1L, 3L), .Label = c("User ID 1", 
"User ID 2", "User ID 3", "User ID 4", "User ID 5"), class = "factor"), 
    V2 = structure(c(4L, 1L, 5L, 2L, 3L, 2L, 1L), .Label = c("Artist 1", 
    "Artist 2", "Artist 3", "Artist 5", "Artist 7"), class = "factor")), .Names = c("V1", 
"V2"), class = "data.frame", row.names = c(NA, -7L))

【讨论】:

  • 这太好了,谢谢!
  • 很好的答案!!!!谢谢格洛腾迪克!!
【解决方案2】:

这行得通:

# get data in useable form
ContingencyTable <- read.table(text=gsub(pattern = " --- ", replacement = ",","User ID 1 --- Artist 5
User ID 2 --- Artist 1
User ID 3 --- Artist 7
User ID 4 --- Artist 2
User ID 5 --- Artist 3
User ID 1 --- Artist 2
User ID 3 --- Artist 1"),sep=",", stringsAsFactors = FALSE)
# add variable for match value
ContingencyTable$Val <- 1
# more or less lifted from Arun's answer linked by @Hong Ooi, above
adjMat <- reshape2::dcast(ContingencyTable, V1 ~ V2, value.var = "Val", fill=0)
rownames(adjMat) <- adjMat[,1]
adjMat <- adjMat[,2:ncol(adjMat)]

adjMat
        Artist 1 Artist 2 Artist 3 Artist 5 Artist 7
User ID 1        0        1        0        1        0
User ID 2        1        0        0        0        0
User ID 3        1        0        0        0        1
User ID 4        0        1        0        0        0
User ID 5        0        0        1        0        0

【讨论】:

  • 谢谢蒂姆....你的回答很有帮助。
  • table(ContingencyTable) 似乎也有效
【解决方案3】:

qdap package 具有可以执行此操作的 adjmat 函数:

dat <- read.table(text=gsub(pattern = " --- ", replacement = ",",
"User ID 1 --- Artist 5
User ID 2 --- Artist 1
User ID 3 --- Artist 7
User ID 4 --- Artist 2
User ID 5 --- Artist 3
User ID 1 --- Artist 2
User ID 3 --- Artist 1"),sep=",", stringsAsFactors = FALSE)


library(qdap)
x <- with(dat, termco(V1, V2, unique(V1)))
adjmat(x)$boolean

## > adjmat(x)$boolean
##           Artist 1 Artist 2 Artist 3 Artist 5 Artist 7
## User ID 1        0        1        0        1        0
## User ID 2        1        0        0        0        0
## User ID 3        1        0        0        0        1
## User ID 4        0        1        0        0        0
## User ID 5        0        0        1        0        0

PS Tim Riffe 读取数据的好方法 :)

【讨论】:

  • 我也认为这被称为布尔矩阵而不是邻接矩阵,但我可能错了。
  • 感谢 Tyler 引用 qdap 包...您的回答非常有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多