我试图在一个非常大的数据集(2600万行)上创建一个在R中的共生矩阵,它基本上如下所示:
自愿性-无偿性-自愿性观察
11000
11112
11112
12223
12223准工业专用产品
12223
12223
12334准工业专用产品
12334
12334准工业专用产品
... ...
持续了很长时间。我想通过ID合并观察,并生成一个观察者ID所观察到的观测的共现矩阵。我对数据的子集进行了处理,但是我“手动”做了一些事情,这对整个集合来说是不实际的。(参见下面的代码)我抵制使用循环的冲动,因为每个人都告诉我,如果你在R中使用循环,你做错了,但我不知道如何实现它。
下面是对较小的一组所起的作用:
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号合并数据,并将每一列(现在表示一棵特定的树)相加,以查看每个观察者记录了多少棵树。
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号。
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])
然后我做了这个..。
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
..。
我应该补充的是,实际上我最终想要对数据进行分层聚类,使用不同树的观测结果的共现作为计算树间“距离”的一种方法。因此,任何关于如何实现这一目标的建议都将是很棒的。如果有一种简单的方法从我所拥有的跳转到一个距离矩阵,我可能会放弃生成上面的矩阵。
发布于 2015-06-22 20:58:34
试试这个:
tapply(cmsclips$ID, cmsclips$Observation, FUN = c)
这里有一个例子:
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
发布于 2015-06-23 21:49:11
好的,我只使用了table(),它做的正是我想要的。学习R.现在学习距离矩阵和聚类.
(谢谢你的帮助,@mts!)
https://stackoverflow.com/questions/30989494
复制相似问题