【问题标题】:R return unique values of specific sub-listsR返回特定子列表的唯一值
【发布时间】:2017-07-11 23:41:26
【问题描述】:

我想处理嵌套列表的信息。例如,一个列表有 3 个 1 级列表,每个列表都有 10 个子列表。我想查找所有 1 级列表的 [[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

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

【问题讨论】:

  • 请设置种子,重新运行您的代码,然后发布所需的结果。

标签: r list unique


【解决方案1】:

试试这个代码,如果这是你想要的,请告诉我......

res <- list()
for(i in 1:10){
  res[[i]] <- unique(as.vector(sapply(myList, function(x) x[[i]])))
}

【讨论】:

    【解决方案2】:

    要在该级别获取每个列表的唯一元素,这将起作用:

    # 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 在这里是一个有用的解决方案,因为它会遍历您提供的第一级列表,并将提供的功能单独应用于每个列表。为了使上面的解决方案更具可移植性,我们可以将它包装在一个以整数作为参数的函数中,以便我们可以从较低级别的列表中动态选择 ith 元素:

    get.i.elem <- function(i) {
      unique(unlist(lapply(myList, function(x) x[[i]])))
    }
    

    【讨论】:

    • 感谢您提供非常有用的说明。您的解决方案几乎就是我想要的。 Luis Tellas 的回答返回了我正在寻找的值。在您的解决方案中,我将获得每个 [[x]][[1]] 的唯一值,但我现在需要这三个列表的唯一值。我想知道如何调整您的代码?
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 2020-05-28
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多