В течение некоторого времени я пытался построить матрицу, заполненную количеством элементов, общих между двумя иерархическими списками.
Вот некоторые фиктивные данные:
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)) )
})
Любая помощь будет высоко ценится.Извиняюсь, если подобная проблема была решена.Я искал интернет, но не нашел его или не понял, как сделать его доступным для меня.