读取多个RDS文件

时间:2016-08-05 21:01:32

标签: r multiple-files

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

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

对数据科学不熟悉我确定这个简单的答案我不知道但是我必须使用像list.files()那样的lapply或者一些for循环。

3 个答案:

答案 0 :(得分:4)

只需添加一个tidyverse答案:

library(tidyverse)

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

更新

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

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

答案 1 :(得分:1)

由于FMM中的解决方案不适用于海量数据集,因此我将bind_rows()替换为data.table::rbindlist()

library(tidyverse)
library(data.table)

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

答案 2 :(得分:0)

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

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. 将数据合并到一个表格(如果您需要)
  4. 我会使用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)
    
相关问题