【问题标题】:Unique classes in a nested list嵌套列表中的唯一类
【发布时间】:2017-02-26 07:52:52
【问题描述】:

我正在寻找一种直接的方法来获取嵌套列表中第一级元素的唯一类。

可重现的例子:

x = list(list(1,"A"), # Unique classes:  character, numeric
         4, # Unique classes: numeric
         list(1,2,list(4,5, list(6)))) # Unique classes: numeric

# Expected return: list(c('character', 'numeric'), c('numeric'), c('numeric'))

【问题讨论】:

    标签: r list nested


    【解决方案1】:

    这行得通

    list_classes <- function(ls) {
      unique(sapply(ls, class))
    }
    
    lapply(x, list_classes)
    
    #[[1]]
    #[1] "numeric"   "character"
    
    #[[2]]
    #[1] "numeric"
    
    #[[3]]
    #[1] "numeric" "list"
    

    编辑:递归版本

    list_classes <- function(ls) {
    
      # get classes of list
      cls <- sapply(ls, class)
    
      # which are lists themselves
      which_ls <- cls == "list"
      lists <- ls[which_ls]
    
      # which are non lists
      non_lists <- cls[!which_ls]
    
      # recursively evaluate contents of list for their classes
      return(
        unique(
          c(non_lists, sapply(lists, list_classes), recursive = T)
        )
      )
    
    }
    
    lapply(x, list_classes)
    
    
    #[[1]]
    #[1] "numeric"   "character"
    
    #[[2]]
    #[1] "numeric"
    
    #[[3]]
    #[1] "numeric"
    

    【讨论】:

    • 仍然与所需的输出不同。
    • 没错,我刚刚意识到,需要解压一些列表
    • @BonStats 一种解决方法是让你的函数递归。
    • 您可以用rapply 替换内部循环——lapply(rapply(x, class, how = "replace"), function(X) unique(unlist(X))) 之类的东西似乎可以工作。
    • @m0h3n 按照建议添加了递归版本。 @alexis_laz 感谢您指出 rapply 我需要调查一下
    猜你喜欢
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2015-04-26
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    相关资源
    最近更新 更多