【问题标题】:Reading multiple RDS files读取多个 RDS 文件
【发布时间】:2016-12-12 08:52:29
【问题描述】:

我有一个包含多个 RDS 文件 (300+) 的目录,我想阅读和合并这些文件,这些 RDS 文件共享相同的基本格式,但每个文件中有不同的行数和几个不同的列。我有读取一个 RDS 文件的简单代码(所有文件都有相同的“Events-3digitnumber-4digitnumber-6digitnumber.RDS”)

    mydata <- readRDS("Events-104-2014-752043.RDS")

作为数据科学的新手,我确信我缺少这个简单的答案,但我是否必须使用 list.files() 之类的东西以及 lapply 或一些 for 循环。

【问题讨论】:

    标签: r


    【解决方案1】:

    只需添加一个tidyverse 答案:

    library(tidyverse)
    
    df <- list.files(pattern = ".RDS") %>%
      map(readRDS) %>% 
      bind_rows()
    

    更新:

    建议使用map_dfr绑定行,使用map_dfc绑定列,效率更高:

    df <- list.files(pattern = ".RDS") %>%
      map_dfr(readRDS)
    

    【讨论】:

      【解决方案2】:

      由于FMM 的解决方案不适用于我处理庞大的数据集,我将bind_rows() 替换为data.table::rbindlist()

      library(tidyverse)
      library(data.table)
      
      df <- list.files(pattern = ".rds") %>%
            map(readRDS) %>% 
            data.table::rbindlist()
      

      【讨论】:

        【解决方案3】:

        首先是一个可重现的例子:

        data(iris)
        # make sure that the two data sets (iris, iris2) have different columns
        iris2 = copy(iris)
        iris2$Species2 = iris2$Species
        iris2$Species = NULL
        
        saveRDS(iris, "Events-104-2014-752043.RDS")
        saveRDS(iris2, "Events-104-2015-782043.RDS")
        

        现在你需要

        1. 查找所有文件名
        2. 读取数据
        3. 将数据合并到一个表中(如果需要)

        我会使用data.table::rbindlist,因为当您设置fill = TRUE 时,它会为您处理不同的列:

        require(data.table)
        files = list.files(path = '.', pattern = '^Events-[0-9]{3}-[0-9]{4}-[0-9]{6}\\.RDS$')
        dat_list = lapply(files, function (x) data.table(readRDS(x)))
        dat = rbindlist(dat_list, fill = TRUE)
        

        【讨论】:

        • 运行上面的代码效果很好!设法合并该目录中的所有文件
        猜你喜欢
        • 1970-01-01
        • 2011-09-22
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多