合并列表列表,仅保留R中不存在高阶列表的元素

时间:2017-02-28 03:17:24

标签: r list

好的,这可能有点难以解释,但请跟我一起:

假设我有一个列表列表,它由相同的元素组成,尽管在元素分组中“升级”的次数越来越少:

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应为:< / p>

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")

在这里,元素有点有序,在我的现实生活数据中并非如此。希望我的问题对你很清楚。你可以帮助我!我有两个星期的时间来处理我的问题,而我只是想解决这个问题,但我需要解决这个问题,以便分析论文中必不可少的内容:/。

感谢您的时间。

编辑:相应地了解问题和玩具示例

2 个答案:

答案 0 :(得分: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()来查找每个值的最大级别。如果你有数百万行或者某些东西,这可能不是最有效的方法,但它应该非常简单易懂。

答案 1 :(得分: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