【问题标题】:Collecting a list of files that doesn't have any data to add to your frame收集没有任何数据要添加到框架的文件列表
【发布时间】:2020-10-05 07:21:08
【问题描述】:

我正在尝试将多个 excel 文件全部加载到一个数据框中。有些文件在我正在寻找的工作表中没有任何数据,所以我正在寻找编写代码来收集确实有数据的文件,但也告诉我哪些文件没有被包括在内,因为它们没有没有任何数据。如果我在 ifelse 语句的 no 部分中简单地“打印(i)”,我编写的代码确实告诉我哪些没有数据。但是,一旦我尝试做其他事情而不是打印,它似乎就忽略了我!真让人生气。如何收集对总数据框没有贡献的文件的名称?

这很好用:

library(readxl)
files <- list.files(path="./sfiles", pattern = "*.xls", full.names = T)
  alldiasendcgmlist <- lapply(files,function(i){
 ifelse(nrow(i)==NULL, NULL, i$name<-i)
   x= read_excel(i,sheet=2,skip=4)

   ifelse(nrow(x)>1,  x$ID <- i, print(i))

     x
     })

但只要我想在向量中收集这些打印,向量就会继续保持为空:

library(readxl)
files <- list.files(path="./sfiles", pattern = "*.xls", full.names = T)
vectornodata <- character(0)

  alldiasendcgmlist <- lapply(files,function(i){
 ifelse(nrow(i)==NULL, NULL, i$name<-i)
   x= read_excel(i,sheet=2,skip=4)

   ifelse(nrow(x)>1,  x$ID <- i, nodata <- append(vectornodata, i))

     x
     })

救命!

【问题讨论】:

    标签: r excel for-loop append na


    【解决方案1】:

    我将用我自己的例子来展示一个人可以做什么。只需让您的函数返回一个列表,然后使用其中一个元素来过滤我们的空数据框:

    input <- c(1,2,3,4,5,6)
    
    func <- function(x){
      list("square"=x^2, "even"= ifelse(x %% 2 == 0, TRUE, FALSE))
    }
    
    res <- lapply(1:6, func) # returns a list of lists
    even_numbers <- input[sapply(res, function(x) x[[2]])] # use 2nd element to filter
    

    在您的情况下,您可以使用布尔向量来识别空文件。

    【讨论】:

      【解决方案2】:

      考虑在没有任何逻辑条件的情况下构建数据框列表。然后运行Filter 来分隔空元素和非空元素。 Negate(另一个高阶函数)用于返回相反的值(即没有lengthNULL 元素)。

      # BUILD NAMED LIST OF EMPTY AND NON-EMPTY DFs
      alldiasendcgmlist <- lapply(files, function(i) read_excel(i,sheet=2,skip=4))    
      alldiasendcgmlist <- setNames(alldiasendcgmlistl), gsub(".xls", "", basename(files)))
      
      # EXTRACT ACTUAL DFs FROM FULL LIST
      full_xlfiles <- Filter(length, alldiasendcgmlist)
      
      # EXTRACT NULL ELEMENTS FROM FULL LIST    
      empty_xlfiles <- Filter(function(df) Negate(length)(df), alldiasendcgmlist)
      empty_xlfiles  <- names(empty_xlfiles)
      

      【讨论】:

        猜你喜欢
        • 2019-11-30
        • 1970-01-01
        • 2020-10-21
        • 2023-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多