首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在大型数据集上生成R中的共现矩阵

在大型数据集上生成R中的共现矩阵
EN

Stack Overflow用户
提问于 2015-06-22 20:45:22
回答 2查看 143关注 0票数 0

我试图在一个非常大的数据集(2600万行)上创建一个在R中的共生矩阵,它基本上如下所示:

自愿性-无偿性-自愿性观察

11000

11112

11112

12223

12223准工业专用产品

12223

12223

12334准工业专用产品

12334

12334准工业专用产品

...            ...

持续了很长时间。我想通过ID合并观察,并生成一个观察者ID所观察到的观测的共现矩阵。我对数据的子集进行了处理,但是我“手动”做了一些事情,这对整个集合来说是不实际的。(参见下面的代码)我抵制使用循环的冲动,因为每个人都告诉我,如果你在R中使用循环,你做错了,但我不知道如何实现它。

下面是对较小的一组所起的作用:

代码语言:javascript
运行
复制
tfmat = data.frame(cmsclip$ID[1:100],
              cmsclip$tree[1:100] %in% c(cmsclip$tree[1]),
               cmsclip$tree[1:100] %in% c(cmsclip$tree[2]),
               cmsclip$tree[1:100] %in% c(cmsclip$tree[3]),
               cmsclip$tree[1:100] %in% c(cmsclip$tree[4]),
               cmsclip$tree[1:100] %in% c(cmsclip$tree[5]),
               cmsclip$tree[1:100] %in% c(cmsclip$tree[6]),
               cmsclip$tree[1:100] %in% c(cmsclip$tree[7]),
               cmsclip$tree[1:100] %in% c(cmsclip$tree[9]),
               cmsclip$tree[1:100] %in% c(cmsclip$tree[10]),
               cmsclip$tree[1:100] %in% c(cmsclip$tree[11]))
colnames(tfmat) <- c('ID', cmsclip$tree[1:7], cmsclip$tree[9:11])

我刚刚选择了前10个唯一的树名,在完整的数据块中恰巧是cmsclip$tree1:7,cmsclip$tree9:11,并且只查看了前100个观察结果,为每一行的每棵树生成了一个真假矩阵。然后,我使用split()来拆分、按ID号合并数据,并将每一列(现在表示一棵特定的树)相加,以查看每个观察者记录了多少棵树。

代码语言:javascript
运行
复制
testsplit = split(tfmat, tfmat[1])
summed1 <-colSums(testsplit$`ficus`)
summed2 <-colSums(testsplit$`cherry`)
summed3 <-colSums(testsplit$`juniper`)
summed4 <-colSums(testsplit$`pine`)
summed5 <-colSums(testsplit$`olive`)
summed6 <-colSums(testsplit$`elm`)
summed7 <-colSums(testsplit$`rain`)
summed8 <-colSums(testsplit$`redwood`)
summed9 <-colSums(testsplit$`shimpaku`)
summed10 <-colSums(testsplit$`maple`)

这方面的问题是,我手工输入了每个名称,而不能用整个数据框架进行输入。这就是我在找更好的东西的地方。我认为将每一行合并成一个最后的矩阵,在给定的列中有每棵树的观察数,其中一行代表一个ID号。

代码语言:javascript
运行
复制
finmat = data.frame(summed1[2:11],summed2[2:11],summed3[2:11],
                summed4[2:11],summed5[2:11],summed6[2:11],
                summed7[2:11],summed8[2:11],summed9[2:11],
                summed10[2:11],summed11[2:11])

然后我做了这个..。

代码语言:javascript
运行
复制
finmat <- t(finmat)
treenames <- c(cmsclip$tree[1:7], cmsclip$tree[9:11])
colnames(finmat) <- treenames

total_occurrences <- colSums(finmat)
data_matrix <- as.matrix(finmat)
co_occurrence <- t(data_matrix) %*% data_matrix
library(igraph)
graph <- graph.adjacency(co_occurrence,
                                                weighted=TRUE,
                                                mode="undirected",
                                                diag=FALSE)

plot(graph,
      vertex.label=names(data),
      vertex.size=total_occurrences*5,
      edge.width=E(graph)$weight*8)

它工作得很好,只是不能扩展到一组更大的数据(太多的手工操作)。任何有关更快的方法的建议都将不胜感激。谢谢!

编辑:理想情况下,我希望创建一个矩阵,其中行对应于每个树的ID号和列,它将显示每棵树的数量。例如:

ID/T5109.2-1988工业专卖产品,产品,技术,技术,工业,工业

11000

11112

12223

12334

..。

我应该补充的是,实际上我最终想要对数据进行分层聚类,使用不同树的观测结果的共现作为计算树间“距离”的一种方法。因此,任何关于如何实现这一目标的建议都将是很棒的。如果有一种简单的方法从我所拥有的跳转到一个距离矩阵,我可能会放弃生成上面的矩阵。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-22 20:58:34

试试这个:

代码语言:javascript
运行
复制
tapply(cmsclips$ID, cmsclips$Observation, FUN = c)

这里有一个例子:

代码语言:javascript
运行
复制
test = data.frame(id = c(11,12,13,14), obs=c("cat", "dog", "cat", "cat"))
#  id obs
#1 11 cat
#2 12 dog
#3 13 cat
#4 14 cat
tapply(test$id, test$obs, FUN = c)
#$cat
#[1] 11 13 14
#
#$dog
#[1] 12
票数 0
EN

Stack Overflow用户

发布于 2015-06-23 21:49:11

好的,我只使用了table(),它做的正是我想要的。学习R.现在学习距离矩阵和聚类.

(谢谢你的帮助,@mts!)

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

https://stackoverflow.com/questions/30989494

复制
相关文章

相似问题

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