使用R,一次循环两个文件

时间:2011-10-14 17:51:51

标签: r loops multiple-files

您好我最喜欢的编码专家,

我试图在R中一次循环两个文件:即取一个'case'文件和另一个'control'文件,创建一个图并将其转储成pdf,然后再取另一组2个文件做相同等等。我有一个列表,指出哪个文件是一个案例,哪个是控件,如下所示:

case   control
A01    G01
A02    G02
A06    G03

等......可以像这样再现:    mylist< - data.frame(rbind(c(“A01”,“G01”),c(“A02”,“G02”),c(“A06”,“G03”)))    colnames(mylist)< - c('control','case')

我找不到一种方法来指定每次循环哪两个文件。 该文件(每个文件包含许多变量)是:“/ Users / francy / Desktop / cc_files_A01”,“”/ Users / francy / Desktop / cc_files_A02“,”/ Users / francy / Desktop / cc_files_A06“,”/ Users / francy / Desktop / cc_files_G01“,”/ Users / francy / Desktop / cc_files_G02“,”/ Users / francy / Desktop / cc_files_G03“

对于每组案例和控制,我想这样做:

case<- read.table(file="/Users/francy/Desktop/case_files_A01.txt", sep = '\t', header = F)
case <- case[,c(1,2,19,20)]
colnames(case)<- c("ID", "fname", "lname", "Position")

control<- read.table(file="/Users/francy/Desktop/case_files_G01.txt", sep = '\t', header = F)
control <- control[,c(1,2,19,20)]
colnames(control)<-  c("ID", "fname", "lname", "Position")

#t-test Position: 
test<- t.test(case[20],control[20])
p.value= round(test$p.value, digits=3)
mean_case= round(mean(case[20], na.rm=T), digits=2)
mean_control= round(mean(control[20], na.rm=T), digits=2)

boxplot(c(case[20], control[20]), names=c(paste("case", "mean", mean_case,     sep=":"),paste("control", "mean", mean_control, sep=":")))

想要创建包含所有箱图的pdf文件。

这就是我现在所拥有的:

myFiles <- list.files(path= "/mypath/", pattern=".txt")
pdf('/home/graph.pdf')
for (x in myFiles) {
  control <- read.table(file = myFiles[x], sep = '\t', header = F)
  ## How do I specify that is the other file here, and which file it is? 
  case <- read.table(file = myFiles[x], sep = '\t', header = F)
}

非常感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:2)

为什么不通过列表将文件对传递给循环?

files <- list(
  c("fileA","fileB"),
  c("fileC","fileD")
  )

for( f in files ) {
  cat("~~~~~~~~\n")
  cat("f[1] is",f[1],"~ f[2] is",f[2],"\n")
}

第一次循环运行时,f包含列表files的第一个元素。由于第一个元素是长度为2的字符向量,f[1]包含该对的第一个文件名,f[2]包含第二个。请参阅上述代码的打印输出,希望能够清楚说明。

答案 1 :(得分:0)

假设您的案例和控件列表位于名为mylist的R对象(数据框或矩阵)中:

for (x in seq_along(nrow(mylist)) {
  case <- read.table(file = paste("/my/path/", mylist[x, "case"], ".txt", sep = ""),
                       sep = "\t", header = F)
  control <- read.table(file = paste("/my/path/", mylist[x, "control"], ".txt", sep = ""),
                       sep = "\t", header = F)
    ## your code here ##
}

答案 2 :(得分:0)

在这种情况下,更有意义的是,从案例和控件的“列表”(data.frame?)中构建两个文件名。

如果data.frame lcc中存在此“列表”,您可以执行以下操作:

for(i in seq(nrow(lcc)))
{
  currentcase<-lcc$case[i]
  currentcontrol<-lcc$control[i]
  currentcasefilename<-paste("someprefix_", currentcase, "_somepostfix.txt")
  currentcontrolfilename<-paste("someprefix_", currentcontrol, "_somepostfix.txt")
  #now open and process both files...
}