【问题标题】:Delete "empty" entries in a list删除列表中的“空”条目
【发布时间】:2014-05-14 03:14:13
【问题描述】:

我有一个list,每个条目都是一个data.frame。我还编写了一个函数,试图清除具有零行的 data.frames:

delete_zeroes <- function(data){
  if(nrow(data) == 0){
    return(NULL)
  }  
  (data)
}

llply(data, delete_zeroes)

但是,这似乎只是将NULL 放在匹配的条目上。我想完全摆脱每个匹配的条目。我怎样才能做到这一点?

【问题讨论】:

    标签: r function data-manipulation


    【解决方案1】:

    您可以使用逻辑索引来排除具有 data.frame 且没有行的每个项目:

    # example data
    l <- list(a=data.frame(a=1:3), b=data.frame(), c=data.frame(a=1:3))
    # $a
    #   a
    # 1 1
    # 2 2
    # 3 3
    # 
    # $b
    # data frame with 0 columns and 0 rows
    # 
    # $c
    #   a
    # 1 1
    # 2 2
    # 3 3
    
    nr <- sapply(l, nrow)
    # a b c 
    # 3 0 3 
    
    l <- l[nr > 0]
    # $a
    #   a
    # 1 1
    # 2 2
    # 3 3
    #
    # $c
    #   a
    # 1 1
    # 2 2
    # 3 3
    

    【讨论】:

      【解决方案2】:

      你可以试试

      sapply(LL, nrow) 将为您提供列表中每个data.frame 中包含行数的向量。 您将其与 0 进行比较,以获得逻辑向量用作子集列表的索引

      LL <- list(data.frame(1:2), data.frame(), data.frame(3:4))
      ##  [[1]]
      ##    X1.2
      ##  1    1
      ##  2    2
      
      ##  [[2]]
      ##  data frame with 0 columns and 0 rows
      
      ##  [[3]]
      ##    X3.4
      ##  1    3
      ##  2    4
      
      LL[sapply(LL, nrow) != 0]
      
      ##  [[1]]
      ##    X1.2
      ##  1    1
      ##  2    2
      
      ##  [[2]]
      ##    X3.4
      ##  1    3
      ##  2    4    
      

      【讨论】:

        【解决方案3】:

        尝试以下方法:

        Filter(nrow, data)
        

        【讨论】:

          猜你喜欢
          • 2020-11-17
          • 2011-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-07
          相关资源
          最近更新 更多