R返回特定子列表的唯一值

时间:2017-07-11 23:41:27

标签: r list unique

我想处理嵌套列表的信息。例如,列表具有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

这将返回单个值而不是所有唯一值。我试图获得所有独特的价值观。 如何正确处理列表中的特定列表?

2 个答案:

答案 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]])))
}