将目录中的所有 Rdata 文件与其中的同名对象合并

Combine all Rdata files in directory with a same name object in it

My data I want to combine my Rdata files into one which is having same object name and save to new combined Rdata file in an directory some think like similar to this thread 但无法做到 出现错误 任何人请建议在 R 中使用任何简单的方法 我是 R 的新手,无法弄清楚。

all.files = c("data1.Rdata", "data1.Rdata", "data1.Rdata")

mylist<- lapply(all.files, function(x) {
  load(file = x)
  get(ls()[ls()!= "filename"])
})

names(mylist) <- all.files

如果我没理解错的话,你想把所有 .RData 合并到一个 data.frame.

一个选项是列出工作目录中扩展名为 .RData 的所有文件,使用 rbind:

加载并合并它们
ll <- list.files(pattern = '.RData')

res <- do.call(rbind,
               lapply(ll, function(x) {
                 
                 load(file = x)
                 get(ls())
               }))

不,我们可以检查前 6 行。

head(res)

#     chrom     start       end                gid         gname                tid strand
#32590   chr7  45574608  45574777 ENSMUSG00000085214 0610005C13Rik ENSMUST00000130094      -
#109006  chr4 154023688 154023891 ENSMUSG00000078350 1190007F08Rik ENSMUST00000143047      -
#475764 chr15  83365029  83365513 ENSMUSG00000075511 1700001L05Rik ENSMUST00000178628      -
#448806 chr13  31567474  31567610 ENSMUSG00000038408 1700018A04Rik ENSMUST00000150418      -
#11159   chr6 147694981 147695041 ENSMUSG00000085077 1700049E15Rik ENSMUST00000152737      +
#339243 chr12  22958352  22960254 ENSMUSG00000073164 2410018L13Rik ENSMUST00000149246      -
#             class biotype byname.uniq bygid.uniq
#32590  altAcceptor lincRNA        TRUE       TRUE
#109006 altAcceptor lincRNA        TRUE       TRUE
#475764 altAcceptor lincRNA        TRUE       TRUE
#448806 altAcceptor lincRNA        TRUE       TRUE
#11159  altAcceptor lincRNA        TRUE       TRUE
#339243 altAcceptor lincRNA        TRUE       TRUE

还有后 6 名:

tail(res)
#       chrom     start       end                gid gname                tid strand
#189235  chr6  90373711  90373841 ENSMUSG00000034430  Zxdc ENSMUST00000113539      +
#563026 chr11  72916473  72916587 ENSMUSG00000055670 Zzef1 ENSMUST00000069395      +
#563046 chr11  72916473  72916587 ENSMUSG00000055670 Zzef1 ENSMUST00000152481      +
#158407  chr3 152449013 152449128 ENSMUSG00000039068  Zzz3 ENSMUST00000106101      +
#158450  chr3 152449013 152449128 ENSMUSG00000039068  Zzz3 ENSMUST00000106103      +
#158465  chr3 152449016 152449128 ENSMUSG00000039068  Zzz3 ENSMUST00000089982      +
#             class        biotype byname.uniq bygid.uniq
#189235 altAcceptor protein_coding       FALSE      FALSE
#563026 altAcceptor protein_coding       FALSE      FALSE
#563046 altAcceptor protein_coding       FALSE      FALSE
#158407 altAcceptor protein_coding       FALSE      FALSE
#158450 altAcceptor protein_coding       FALSE      FALSE
#158465 altAcceptor protein_coding       FALSE      FALSE

你可以检查尺寸。

dim(res)
#24279    11

编辑

这适用于 R 4.0.3。似乎 R 4.1.1. 失败了。我将使用新的解决方案编辑答案。

我通常使用循环来执行此操作:

FileVector <- c("data1.Rdata", "data1.Rdata", "data1.Rdata")
Res <- vector(mode = "list",
              length = length(FileVector))

for (m1 in seq_along(FileVector)) {
  FilesLoaded <- load(file = FileVector[m1],
                      verbose = FALSE)
  if ("filename" %in% FilesLoaded) {
    Res[[m1]] <- get("filename")
  }
  rm(list = FilesLoaded)
}

这给了我们一个列表,我们可以在循环中添加其他检查,也就是说,不要在任何列中添加具有某些值的数据,或者我们也可以检查每个新数据以确保特定列名称存在。如果您有现实世界的问题,例如某些数据文件未正确生成,您也可以将 load() 调用包装在 try() 调用中。然后我们用 do.call()

一起猛击它
# Null positions will be dropped
Res <- do.call(rbind,
               Res)

使用 list.files() 之类的东西构建文件名向量并指定 pattern = 参数通常是有利的。

通常看起来像这样:

FileVector <- list.files(path = "~/my/directory",
                         full.names = TRUE,
                         pattern = "mypattern")