【问题标题】:use an R script on all files in directory对目录中的所有文件使用 R 脚本
【发布时间】:2013-06-07 09:44:09
【问题描述】:

您好,我有以下 R 脚本

emboss<-read.table("emboss_002.ss",header=T)
x<-table(emboss[,2],emboss[,3])/NROW(emboss[,3])
y<-as.vector(t(x))
nms <- expand.grid(colnames(x), rownames(x))
names(y) <- paste( nms[,2],nms[,1],sep="")
write.table(t(y), file = "nontpsec.csv",append=TRUE)

我有超过 300 个名为 emboss_[i].ss 的文件

如何遍历文件夹以在每个文件上运行此脚本?每个输出都进入同一个 .csv 文件。

顺便说一下 - 这是我的数据框 (x)

x

              C           E           H
  A 0.057971014 0.017391304 0.026086957
  C 0.005797101 0.002898551 0.002898551
  D 0.046376812 0.000000000 0.002898551
  E 0.063768116 0.002898551 0.020289855
  F 0.011594203 0.005797101 0.005797101
  G 0.069565217 0.002898551 0.002898551
  H 0.028985507 0.000000000 0.000000000
  I 0.017391304 0.008695652 0.002898551
  K 0.014492754 0.002898551 0.002898551
  L 0.043478261 0.011594203 0.034782609
  M 0.005797101 0.002898551 0.002898551
  N 0.017391304 0.000000000 0.005797101
  P 0.055072464 0.000000000 0.000000000
  Q 0.046376812 0.002898551 0.008695652
  R 0.049275362 0.011594203 0.023188406
  S 0.043478261 0.005797101 0.002898551
  T 0.034782609 0.017391304 0.014492754
  V 0.037681159 0.014492754 0.008695652
  W 0.014492754 0.008695652 0.002898551
  Y 0.026086957 0.008695652 0.011594203

非常感谢!

【问题讨论】:

  • 打开、写入和关闭文件 300 次会很慢。你最好打开一个文件连接。
  • 目前对速度并不完全感兴趣 - 但感谢您的指点。将查看文件连接

标签: r file loops directory


【解决方案1】:

这是未经测试的,所以它可能有点偏离。 我会创建一个新函数,收集所有文件并将该函数应用于每个文件。

runForAll <- function(x) {
  emboss <- read.table(x,header=T)
  x <- table(emboss[,2],emboss[,3])/NROW(emboss[,3])
  y <- as.vector(t(x))
  nms <- expand.grid(colnames(x), rownames(x))
  names(y) <- paste( nms[,2],nms[,1],sep="")
  return(t(y))
}

my.files <- list.files(pattern = ".ss")
outputs <- lapply(my.files, FUN = runForAll)   

library(plyr)
one.header.output <- rbind.fill.matrix(outputs)
write.table(one.header.output, file = "nontpsec.csv")

您也可以通过R CMD 运行它。

【讨论】:

  • 为什么sapply在这里?在这里使用lapply 不是更好/更安全吗?
  • 谢谢 - 可以在这里看到你在做什么。我在[.data.frame(emboss, , 2) 中遇到错误:选择了未定义的列此外:警告消息:在 write.table(t(y), file = "nontpsec.csv", append = TRUE) 中:附加列要归档的名称
  • @bruce:你想要一个文件头,还是每行一个?如果只有一个标题,我认为您必须一次分析所有数据以找到第 2 列和第 3 列的所有可能组合。
  • 最好只有一个标题,尽管在我的测试用例中,当前代码每隔一行生成一个标题行。不理想,但我可以使用 excel 过滤器摆脱它们。
  • 这意味着my.files 包含一个至少没有两列的文件。尝试使list.files 模式".ss" 更强一些,也许是"emboss_\\d+\\.ss"。如果还是报错,你应该自己找出是哪个文件出错并修复它。
猜你喜欢
  • 2021-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 1970-01-01
  • 2018-10-29
  • 2010-12-29
相关资源
最近更新 更多