【发布时间】:2019-05-08 11:31:02
【问题描述】:
一段时间以来,我一直在尝试构建一个矩阵,该矩阵由两个分层列表之间的共同元素计数填充。
这是一些虚拟数据:
site<-c('A','A','A','A','A','A','A','A','A','B','B','B','B','B','B')
group<-c('A1','A1','A2','A2','A2','A3','A3','A3','A3',
'B1','B1','B2','B2','B2','B2')
element<-c("red","orange","blue","black","white", "black","cream","yellow","purple","red","orange","blue","white","gray","salmon")
d<-cbind(site,group,element)
我创建了一个列表结构,假设由于每个列表中的 os 元素数量不同,它会是程序性的。另外,因为我不希望在组之间进行所有可能的比较,而只希望在站点之间进行比较。
#first level list - by site
sitelist<-split(nodmod, list(nodmod$site),drop = TRUE)
#list by group
nestedlist <- lapply(sitelist, function(x) split(x, x[['mod']], drop = TRUE))
我的目的是创建一个表格或矩阵,其中包含两个站点的组之间共有的元素数量(我的原始数据有其他站点)。像这样:
A1 A2 A3
B1 2 0 0
B2 0 2 0
这个问题的嵌套性质对我来说是一个挑战。我对列表不太熟悉,因为我主要使用数据框解决了问题。我的尝试归结为这一点。我觉得它已经接近了,但是对于循环的正确语法有很多缺点。
t <- outer(1:length(d$A),
1:length(d$B),
FUN=function(i,j){
sapply(1:length(i),
FUN=function(x)
length(intersect(d$A[[i]]$element, d$B[[j]]$element)) )
})
任何帮助将不胜感激。如果解决了类似的问题,我们深表歉意。我已经搜索了互联网,但没有找到它,或者没有理解将其转移到我的解决方案。
【问题讨论】:
-
第 10 行有
site = A和group = B1。对吗? -
我的错误,现在正在编辑。
-
你想要做的是一个共现矩阵。您可以从 data.frame 结构开始,使用
data.frame()代替cbind(),然后使用crossprod(table(d[,c(3,2)]))。看看这个question。