首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将表转换为矩阵进行聚类分析

将表转换为矩阵进行聚类分析
EN

Stack Overflow用户
提问于 2018-05-24 09:26:16
回答 2查看 60关注 0票数 0

所以我有一个表,它告诉两个变量(V1和V2)的freq (N)一起出现。以下是一个示例:

代码语言:javascript
复制
> dput(ans)
structure(list(V1 = c(2L, 7L, 7L, 7L, 7L, 7L, 9L, 9L, 9L, 10L, 
10L, 11L, 12L, 12L, 13L, 13L, 13L, 13L, 13L, 13L, 13L, 14L, 14L, 
14L, 14L, 15L, 15L, 15L, 16L, 16L, 16L, 16L, 17L, 17L, 17L, 20L, 
20L, 21L, 25L, 29L, 29L, 29L, 33L, 35L, 38L, 42L, 46L, 46L, 46L, 
46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 46L, 47L, 47L, 48L, 52L, 
52L, 52L, 52L, 52L, 56L, 56L, 56L, 56L, 56L, 56L, 56L, 57L, 57L, 
57L, 57L, 57L, 57L, 58L, 58L, 58L, 58L, 58L, 59L, 59L, 59L, 59L, 
60L, 60L, 60L, 61L, 61L, 62L, 65L, 65L, 65L, 65L, 67L, 67L, 67L, 
68L, 70L, 70L, 71L, 73L, 73L, 74L), V2 = c(3L, 8L, 20L, 21L, 
22L, 78L, 10L, 11L, 12L, 11L, 12L, 12L, 38L, 39L, 14L, 15L, 16L, 
17L, 18L, 29L, 64L, 15L, 16L, 17L, 18L, 16L, 17L, 18L, 17L, 18L, 
29L, 30L, 18L, 29L, 30L, 21L, 22L, 22L, 26L, 30L, 47L, 64L, 34L, 
36L, 39L, 43L, 47L, 48L, 49L, 52L, 65L, 67L, 70L, 71L, 72L, 73L, 
74L, 75L, 48L, 49L, 49L, 65L, 67L, 73L, 74L, 75L, 57L, 58L, 59L, 
60L, 61L, 62L, 63L, 58L, 59L, 60L, 61L, 62L, 63L, 59L, 60L, 61L, 
62L, 63L, 60L, 61L, 62L, 63L, 61L, 62L, 63L, 62L, 63L, 63L, 67L, 
73L, 74L, 75L, 73L, 74L, 75L, 69L, 71L, 72L, 72L, 74L, 75L, 75L
), N = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)),
 row.names = c(NA, -108L), class = c("data.table", "data.frame"))

我想把它转换成一个696x696矩阵,其中V1和V2作为行和列(从1-696在行和列中),N作为值。V1和V2表示我的数据集中的材料。如果表中不存在V1和V2组合,则值应为0。这是因为我想根据它们出现的频率来对材料进行聚类,使用带质心函数的hclust。

编辑:我可以给出一个期望输出的例子的唯一方法是下面一篇文章中的图片:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-24 13:17:33

为了复制您添加到原始问题中的图片,我会这样做:

代码语言:javascript
复制
# convert your contingency table to the appropriate matrix
M <- sparseMatrix(df$V1, df$V2, x = df$N, dims = c(696, 696))
M <- as.matrix(M)
rownames(M) <- 1:696
colnames(M) <- 1:696

有许多格式选项可用于将矩阵显示为图像,但首先,请尝试:

代码语言:javascript
复制
View(M)

票数 0
EN

Stack Overflow用户

发布于 2018-05-24 10:25:07

这是光栅的共同任务..。使用光栅包并将其转换回矩阵可能不是最快的解决方案,但它可以很好地处理测试数据(这里称为df).

代码语言:javascript
复制
library(raster)

r <- raster(nrow=696, ncol=696, crs = NA,
            xmn = 0, xmx = 696, ymn = 0, ymx = 696)
# some indexing corrections
new_xy <- cbind(df[, 2] - 1, 697 - df[, 1])
cells <- cellFromXY(r, new_xy)
r[] <- 0
r[cells] <- unlist(df[, 3])
r <- as.matrix(r)

然后我们可以使用str(r)检查它是一个696x696数值,而max(r)是一个3的值,正如预期的那样。还有,r[2, 3] = 1

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50505682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档