我有一个包含多个RDS文件(300+)的目录,我想阅读和合并,这些RDS文件共享相同的基本格式,但行数和行数不同。每个文件中有几个不同的列。我有简单的代码来读取一个RDS文件(所有文件都有相同的" Events-3digitnumber-4digitnumber-6digitnumber.RDS")
mydata <- readRDS("Events-104-2014-752043.RDS")
对数据科学不熟悉我确定这个简单的答案我不知道但是我必须使用像list.files()那样的lapply或者一些for循环。
答案 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")
现在你需要
我会使用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)