R-嵌套列表的参数子集列表

R-嵌套列表的参数子集列表,r,list,dplyr,plyr,R,List,Dplyr,Plyr,我有一个包含嵌套列表的列表 我想子集或创建一个新列表,根据指定的参数选择特定子集,详细信息如下: List_1 <- list(a = matrix(5,2), b = matrix(5,7), c = matrix(5,9), d = matrix(5,3)) List_2 <- list(a = matrix(7,3), b = matrix(7,7), c = matrix(7,1), d = matrix(7,9)) List_3 <- list(a = matrix(

我有一个包含嵌套列表的列表

我想子集或创建一个新列表,根据指定的参数选择特定子集,详细信息如下:

List_1 <- list(a = matrix(5,2), b = matrix(5,7), c = matrix(5,9), d = matrix(5,3))
List_2 <- list(a = matrix(7,3), b = matrix(7,7), c = matrix(7,1), d = matrix(7,9))
List_3 <- list(a = matrix(5,2), b = matrix(5,7), c = matrix(5,9), d = matrix(5,3))
List_4 <- list(a = matrix(5,2), b = matrix(5,7), c = matrix(5,9), d = matrix(5,3))
List_5 <- list(a = matrix(5,2), b = matrix(5,7), c = matrix(5,9), d = matrix(5,3))

List_tot <- list(List_1, List_2, List_3, List_4, List_5)
我想选择:

  • 对于每个嵌套列表,仅选择列表/矩阵a、c和d
  • 对于每个嵌套列表,选择两个行数最多的列表/矩阵
  • 因此,
    New\u List\u tot
    的输出为:

    内容如下:

    [[1]]
    
    [[1]]$a
         [,1]
    [1,]    5
    [2,]    5
    
    [[1]]$b
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
    [4,]    5
    [5,]    5
    [6,]    5
    [7,]    5
    
    [[1]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[1]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
    
    
    [[2]]
    [[2]]$a
         [,1]
    [1,]    7
    [2,]    7
    [3,]    7
    
    [[2]]$b
         [,1]
    [1,]    7
    [2,]    7
    [3,]    7
    [4,]    7
    [5,]    7
    [6,]    7
    [7,]    7
    
    [[2]]$c
         [,1]
    [1,]    7
    ...etc
    
    [[1]]
    
    [[1]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[1]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
    etc...
    

    任何援助都会有帮助。我所有的尝试,尝试使用plyer和dplyr,但没有成功,而且非常困难。

    我们可以使用
    base R
    来实现这一点。不需要软件包

    lapply(List_tot, `[`, c("a", "c", "d"))
    
    或者使用匿名函数

    lapply(List_tot, function(x) x[c("a", "c", "d")])
    

    如果我们需要前2个,
    order
    行数(
    length
    工作,因为它们是单列
    矩阵
    ,因此行数等于元素总数,获取行数的有序向量的
    名称
    ,并使用它来提取内部列表元素

    lapply(List_tot, function(x) {
          x1 <- x[c("a", "c", "d")]
          v1 <- lengths(x1)
          x1[head(names(v1)[order(-v1)], 2)]
        })
    
    lapply(列表,函数(x){
    
    x1我们可以使用
    base R
    来实现这一点。不需要软件包

    lapply(List_tot, `[`, c("a", "c", "d"))
    
    或者使用匿名函数

    lapply(List_tot, function(x) x[c("a", "c", "d")])
    

    如果我们需要前2个,
    order
    行数(
    length
    工作,因为它们是单列
    矩阵
    ,因此行数等于元素总数,获取行数的有序向量的
    名称
    ,并使用它来提取内部列表元素

    lapply(List_tot, function(x) {
          x1 <- x[c("a", "c", "d")]
          v1 <- lengths(x1)
          x1[head(names(v1)[order(-v1)], 2)]
        })
    
    lapply(列表,函数(x){
    
    x1在基数R中,您可以执行以下操作:

    lapply(List_tot, 
       function(x) (y<-x[c("a", "c", "d")])[order(sapply(y, nrow), decreasing  = TRUE)[1:2]])
    
    [[1]]
    [[1]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[1]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
     etc
    
    lappy(列表),
    
    函数(x)(y在基数R中,您可以执行以下操作:

    lapply(List_tot, 
       function(x) (y<-x[c("a", "c", "d")])[order(sapply(y, nrow), decreasing  = TRUE)[1:2]])
    
    [[1]]
    [[1]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[1]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
     etc
    
    lappy(列表),
    函数(x)(yUpdate)
    对于第二个目标,您可以尝试

    lapply(
      List_tot,
      function(lst) {
        head(lst[c("a", "c", "d")][order(-sapply(lst[c("a", "c", "d")], nrow))], 2)
      }
    )
    
    library(magrittr)
    List_colfilter <- lapply(List_tot, function(i)i[c("a","c","d")])
    
    longestlist <- function(l){
      maxr <- lapply(l,nrow) %>% unlist %>% max
      l2 <- lapply(l, function(x) if(nrow(x)==maxr) x else NA)
      for (n in names(l)){
        if (is.na(l2[n])){
          l2[n] <- NULL
        }
      }
      return(l2)
    }
    List_longfilter <- lapply(List_colfilter, longestlist)
    

    [[1]]
    [[1]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[1]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
    
    
    [[2]]
    [[2]]$d
          [,1]
     [1,]    7
     [2,]    7
     [3,]    7
     [4,]    7
     [5,]    7
     [6,]    7
     [7,]    7
     [8,]    7
     [9,]    7
    
    [[2]]$a
         [,1]
    [1,]    7
    [2,]    7
    [3,]    7
    
    
    [[3]]
    [[3]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[3]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
    
    
    [[4]]
    [[4]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[4]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
    
    
    [[5]]
    [[5]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[5]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
    

    • 对于第一个目标,“对于每个嵌套列表,仅选择列表/矩阵a、c和d。”
    • 第二个目标是“为每个嵌套列表选择行数最多的列表/矩阵”
    使现代化 对于第二个目标,您可以尝试

    lapply(
      List_tot,
      function(lst) {
        head(lst[c("a", "c", "d")][order(-sapply(lst[c("a", "c", "d")], nrow))], 2)
      }
    )
    
    library(magrittr)
    List_colfilter <- lapply(List_tot, function(i)i[c("a","c","d")])
    
    longestlist <- function(l){
      maxr <- lapply(l,nrow) %>% unlist %>% max
      l2 <- lapply(l, function(x) if(nrow(x)==maxr) x else NA)
      for (n in names(l)){
        if (is.na(l2[n])){
          l2[n] <- NULL
        }
      }
      return(l2)
    }
    List_longfilter <- lapply(List_colfilter, longestlist)
    

    [[1]]
    [[1]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[1]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
    
    
    [[2]]
    [[2]]$d
          [,1]
     [1,]    7
     [2,]    7
     [3,]    7
     [4,]    7
     [5,]    7
     [6,]    7
     [7,]    7
     [8,]    7
     [9,]    7
    
    [[2]]$a
         [,1]
    [1,]    7
    [2,]    7
    [3,]    7
    
    
    [[3]]
    [[3]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[3]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
    
    
    [[4]]
    [[4]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[4]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
    
    
    [[5]]
    [[5]]$c
          [,1]
     [1,]    5
     [2,]    5
     [3,]    5
     [4,]    5
     [5,]    5
     [6,]    5
     [7,]    5
     [8,]    5
     [9,]    5
    
    [[5]]$d
         [,1]
    [1,]    5
    [2,]    5
    [3,]    5
    

    • 对于第一个目标,“对于每个嵌套列表,仅选择列表/矩阵a、c和d。”
    • 第二个目标是“为每个嵌套列表选择行数最多的列表/矩阵”

    @akrun对步骤1(按列筛选)有一个清晰的答案。对于步骤2(按您可以尝试的行数筛选)

    lapply(
      List_tot,
      function(lst) {
        head(lst[c("a", "c", "d")][order(-sapply(lst[c("a", "c", "d")], nrow))], 2)
      }
    )
    
    library(magrittr)
    List_colfilter <- lapply(List_tot, function(i)i[c("a","c","d")])
    
    longestlist <- function(l){
      maxr <- lapply(l,nrow) %>% unlist %>% max
      l2 <- lapply(l, function(x) if(nrow(x)==maxr) x else NA)
      for (n in names(l)){
        if (is.na(l2[n])){
          l2[n] <- NULL
        }
      }
      return(l2)
    }
    List_longfilter <- lapply(List_colfilter, longestlist)
    
    库(magrittr)
    
    List_colfilter@akrun对步骤1(按列筛选)有一个清晰的答案。对于步骤2,可以尝试按行数筛选

    lapply(
      List_tot,
      function(lst) {
        head(lst[c("a", "c", "d")][order(-sapply(lst[c("a", "c", "d")], nrow))], 2)
      }
    )
    
    library(magrittr)
    List_colfilter <- lapply(List_tot, function(i)i[c("a","c","d")])
    
    longestlist <- function(l){
      maxr <- lapply(l,nrow) %>% unlist %>% max
      l2 <- lapply(l, function(x) if(nrow(x)==maxr) x else NA)
      for (n in names(l)){
        if (is.na(l2[n])){
          l2[n] <- NULL
        }
      }
      return(l2)
    }
    List_longfilter <- lapply(List_colfilter, longestlist)
    
    库(magrittr)
    
    谢谢你的反馈,你能解释一下吗?我的意思是(可能是我错了)。是否必须仅对选定的列表元素(即“a”、“c”、“d”)执行此操作,并返回一个,其中包含每个外部元素的最大行数lis@akrun好的,我明白你的意思。我认为这是两个独立的目标…谢谢你的信息,对于第二个目标,我正在尝试获得前两个行数最多的列表。我只是编辑d OP.@akrun好的,我更新了我的解决方案:)@akrun谢谢你的反馈,你能解释一下吗?我的意思是(可能是我错了)。是否必须仅对选定的列表元素(即“a”、“c”、“d”)执行此操作,并返回一个,其中包含每个外部元素的最大行数lis@akrun好的,我明白你的意思。我认为这是两个独立的目标…谢谢你的信息,对于第二个目标,我正在尝试获得前两个行数最多的列表。我只是编辑d OP.@akrun Okey,我更新了我的解决方案:)如果这些不是单列,那么
    nrow()
    会起作用吗?@jackkelly然后,我们需要一个带有
    sapply/lappy
    的第二个循环,即
    v1如果这些不是单列,那么
    nrow()
    会起作用吗?@jackkelly然后,我们需要一个带有
    sapply/lappy
    的第二个循环,即
    v1