我想处理嵌套列表的信息。例如,列表具有3个第一级列表,每个列表具有10个子列表。我想找到所有第一级列表'[[i]]子列表的唯一值。
## Design of list
list1 = replicate(10, list(sample(10, 5, replace = FALSE)))
list2 = replicate(10, list(sample(10, 5, replace = FALSE)))
list3 = replicate(10, list(sample(10, 5, replace = FALSE)))
myList = list(list1, list2, list3)
## return unique values of each list's i-th sub-list
## example
> k = unique(myList[[1:3]][[1]])
> k
[1] 10
这将返回单个值而不是所有唯一值。我试图获得所有独特的价值观。 如何正确处理列表中的特定列表?
答案 0 :(得分:0)
要获得该级别的每个列表的唯一元素,这将起作用:
# set seed so that "random" number generation is reproducible
set.seed(123)
# set replace to TRUE so we can see if we're getting unique elements
# when replace is FALSE, all elements are already unique :)
list1 <- replicate(10, list(sample(10, 5, replace = TRUE)))
list2 <- replicate(10, list(sample(10, 5, replace = TRUE)))
list3 <- replicate(10, list(sample(10, 5, replace = TRUE)))
myList <- list(list1, list2, list3)
# use lapply to apply anonymous function to the top levels of the list
# unlist results and then call unique to get unique values
k <- unique(unlist(lapply(myList, function(x) x[[1]])
输出:
[[1]]
[1] 3 8 5 9 10
[[2]]
[1] 1 5 8 2 6
[[3]]
[1] 6 4 5 10
您遇到的问题是由于您在索引的第一级使用双括号(myList[[1:3]]
)这一事实。该表示法仅在索引到单个列表时起作用 - 跨列表的多个元素工作,使用单个括号。但是,在这种情况下,由于myList[1:3][[1]]
首先抓住了所有三个最顶层的列表,然后是第一个列表([[1]]
),因此无法完成任务,因此,您最终会在列表列表中调用unique
(在这种情况下,这些列表都是唯一的)。
lapply
在这里是一个有用的解决方案,因为它运行在您提供的第一级列表上,并分别应用为每个列表提供的功能。为了使上面的解决方案更具可移植性,我们可以将它包装在一个以整数作为参数的函数中,这样我们就可以从较低级别的列表中动态选择i
元素:
get.i.elem <- function(i) {
unique(unlist(lapply(myList, function(x) x[[i]])))
}
答案 1 :(得分:0)
试试这段代码,让我知道这是否是你想要的......
res <- list()
for(i in 1:10){
res[[i]] <- unique(as.vector(sapply(myList, function(x) x[[i]])))
}