【发布时间】:2019-05-08 18:10:06
【问题描述】:
这是先前在此处发布的问题的变体。 R - A loop comparing elements in common between two hierarchical lists 我认为这个问题可能会对其解决方案形式产生足够的改变,因此是一个新帖子。
在比较两个分层结构的列表时,我想检索一个共同元素的列表(站点包含组,其中包含元素)
这是一些虚拟数据:
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)
转折点在于,我不希望在组之间进行所有可能的比较,而只希望在站点之间进行比较。因此,我以这种方式组织数据。
#first level list - by site
sitelist<-split(d, list(d$site),drop = TRUE)
#list by group
nestedlist <- lapply(sitelist, function(x) split(x, x[['group']], drop = TRUE))
我的目的是创建一个列表,其中包含两个站点的组之间的共同元素(我的原始数据有其他站点)。因此,如果数据的结构如下:
A1 A2 A3
B1 2 0 0
B2 0 2 0
我需要出现在 A1/B1 和 A2/B2 交叉点的元素列表。 因此输出为:
output
$A1-B1
[1] "red" "orange"
$A2-B2
[2] "blue" "white"
我的尝试与上一个相关问题中发布的内容类似,只是对我认为可行的内容进行了调整。
t <- outer(1:length(d$A),
1:length(d$B),
FUN=function(i,j){
sapply(1:length(i),
FUN=function(x)
intersect(d$A[[i]]$element, d$B[[j]]$element) )
})
再次,非常感谢任何帮助,如果这与问题过于相似,我们深表歉意。我尝试调整所有建议都失败了。
【问题讨论】:
-
这段代码有多少工作?我的
$ operator is invalid很快就失败了,因为(我假设)你的d是一个框架,但你在这里提供的是一个matrix。