【问题标题】:Combine all Rdata files in directory with a same name object in it将目录中的所有 Rdata 文件与其中的同名对象合并
【发布时间】:2021-08-26 05:08:52
【问题描述】:

My data 我想将我的 Rdata 文件合并到一个具有相同对象名称的文件中,并保存到一个目录中的新组合 Rdata 文件中,有些人认为像 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

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。你的代码现在是什么样子的?你遇到了什么错误?
  • @MrFlick 好的,我会加入

标签: r rdata


【解决方案1】:

如果我理解正确,您希望将所有 .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. 失败。我将使用新的解决方案编辑答案。

【讨论】:

  • 使用上面的代码我收到错误我在包含我没有正确理解的目录的文件上运行此代码
  • 您遇到的错误是什么?它对我有用。
  • Error in lapply(ll, function(x) { : object 'll' not found 这个错误我什至不明白为什么 ll 在那里而且我是 R 的初学者
  • @ShrilaxmiMS 我已经编辑了我的答案。代码的一部分丢失了。请立即检查。
  • 仍然收到错误'get(ls()[ls() != "filename"]) 中的错误:第一个参数的长度 > 1 调用自:get(ls()[ls() != "文件名"])'
【解决方案2】:

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

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")

【讨论】:

  • Res &lt;- vector(mode = "list", length = length(FileVector)) 给我空输出你能告诉我为什么
  • 如果您的工作区中没有 FileVector 对象,您的构造函数将返回一个长度为 1 且带有 NULL 的列表。它在你的工作区吗?它是如何建造的?
猜你喜欢
  • 2013-01-23
  • 1970-01-01
  • 1970-01-01
  • 2018-06-13
  • 1970-01-01
  • 2013-06-03
  • 1970-01-01
  • 1970-01-01
  • 2020-10-31
相关资源
最近更新 更多