2017-02-28 48 views
1

好吧,这可能是一个有点难以解释,但挂我:合并名单列表,只保留未在R有高阶列表中的元素

假设我有一个列表的列表,它由相同的元素,虽然越来越少,因为我们中的元素分组“升级”:

level.list <- list(
list(1,2,3,4,5,6,7,8,9,10,11,12,13,14), # base level 
list(c(1,2,3),c(4,5),c(6,7),c(13,14)),  # level 2 groups 
list(c(1,2,3,6,7),c(4,5,9)),  # level 3 groups  
list(c(4,5,9,12)) # level 4 groups 
) 

因此,列表中的每个列表包含一些从该列表中的元素之前,将它们合并在更大的群体中。

问题是,如果列表中的某个组不在列在“更高级别”列表中,那么该组是最后一个列表。如果一个元素出现在更高级别的列表中,那么在级别2 [6,7]合并的元素组合并到级别3的元素组[1,2,3],然后包含2级别的组[6,7]和另一个包含[1,2,3]的2级组不应该成为最终名单的一部分,因为两者都存在于共享组[1,2,3,6,7]中,而这被赋予优先权。

列表元素是数据集中的索引,它将观察结果分组在较高和较高的级别。所以实际上,这是“中途完成”列表,它创建了一个分组变量。

我根本不知道该怎么做,找到一种方法将第一个列表与其他列表合并,从列表中删除“低位”分组。所以我得到一个矩阵/ df,其中包含一个元素所在的“最高级别”,以及第二个数字,告诉我某个给定元素处于该级别的哪个组,因此矩阵/ df应该是这样的:

group.matrix <- matrix(c(
1  , "3.1" , 
2  , "3.1" , 
3  , "3.1" , 
4  , "4.1" , 
5  , "4.1" , 
6  , "3.1" , 
7  , "3.1" , 
8  , "1.1" , 
9  , "4.1" , 
10 , "1.2" , 
11 , "1.3" , 
12 , "4.1" , 
13 , "2.2" , 
14 , "2.2" 
     ), 
      nrow = 14, ncol = 2, byrow = TRUE) 
colnames(group.matrix) <- c("first.level","group") 

在这里,元素有点有序,这是不是在我的现实生活中的数据。希望我的问题对你很清楚。而且你可以帮助我!我有两个星期的时间来交换我的masterthesis,我只是想着这个问题,但我需要解决这个问题,以便分析论文中的一些重要内容:/。

谢谢你的时间。

编辑:有关于这个问题,并相应地在玩具示例

+0

'库(tidyverse); level.list%>%map2_df(seq_along(。),〜data.frame(x = unlist(.x),i = .y))%>%group_by(x)%>%summarize(i = max(i) )' – alistaire

+0

谢谢!我已经更新了这个问题,忘记了一些重要的东西,在MrFlicks的回答中看到我的评论(或者再次阅读更新后的问题) 只是好奇,为什么不把它作为答案? =) – emilBeBri

回答

4

下面是使用基函数

at_levels <- Map(function(i, x) cbind(i=i, x=unlist(x)), seq_along(level.list), level.list) 
aggregate(i~x, do.call("rbind", at_levels), max) 

#  x i 
# 1 1 3 
# 2 2 3 
# 3 3 3 
# 4 4 4 
# 5 5 4 
# 6 6 3 
# 7 7 3 
# 8 8 1 
# 9 9 4 
# 10 10 1 
# 11 11 1 
# 12 12 4 
# 13 13 2 
# 14 14 2 

基本上我使用Map()跟踪出现哪一级的每个号码(允许重复)中的溶液,然后我使用aggregate()查找每个值的最大值。如果你有几百万行或者某些东西,这可能不是最有效的方法,但它应该是非常直截了当的理解。

+0

@thelatemail期望的输出帮助了很多。主要是一个幸运的猜测:) – MrFlick

+0

谢谢!我忘记了创建的分组变量还应该包含该元素所处的特定数字的重要信息。当我写下这个问题的时候已经过了半夜,对不起。你们好棒。 – emilBeBri

+0

根本不会逼迫你,但是你认为你知道如何做到这一点,还是仅仅因为问题的增加而太难了?因为,我可以手工完成最后一部分,至少在第一次将元素分类到正确的级别之后,这是可能的,然后是“子” - 将该元素排列到该级别的列表元素中,I如果它太难以自动化,可以手动完成。谢谢! – emilBeBri

3

使用max.colmapply%in%沿另一尝试做检查如果一个值是在一个较高的水平的繁重的工作:

max.col(mapply(`%in%`, level.list[1], lapply(level.list, unlist)), "last") 
#[1] 3 3 3 4 4 3 3 1 4 1 1 4 2 2 
+0

谢谢!我更新了这个问题,忘记了一些重要的事情,在MrFlicks的回答中看到我的评论(或者再次阅读更新后的问题) – emilBeBri