好的,这可能有点难以解释,但请跟我一起:
假设我有一个列表列表,它由相同的元素组成,尽管在元素分组中“升级”的次数越来越少:
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")
在这里,元素有点有序,在我的现实生活数据中并非如此。希望我的问题对你很清楚。你可以帮助我!我有两个星期的时间来处理我的问题,而我只是想解决这个问题,但我需要解决这个问题,以便分析论文中必不可少的内容:/。
感谢您的时间。
编辑:相应地了解问题和玩具示例
答案 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.col
和mapply
以及%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