С помощью R зацикливайтесь на двух файлах одновременно - PullRequest
3 голосов
/ 14 октября 2011

Здравствуйте, мои любимые эксперты по кодированию,

Я пытаюсь перебрать два файла одновременно в 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') </p>

Я не могу найти способ указать, какие 2 файла следует просматривать каждый раз.Файл (каждый файл со многими переменными): "/ 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 ]

2 голосов
/ 14 октября 2011

Почему бы просто не передать пары файлов в циклы через список?

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 содержит 1-й элемент списка files.Поскольку первый элемент является символьным вектором длины два, f[1] содержит первое имя файла пары, а f[2] содержит второе.См. Распечатку вышеприведенного кода, которая, надеюсь, должна прояснить ситуацию.

0 голосов
/ 14 октября 2011

Что, вероятно, имеет больше смысла в этом случае, это создание двух имен файлов из вашего «списка» (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...
}
0 голосов
/ 14 октября 2011

Предполагается, что ваш список наблюдений и элементов управления находится в R-объекте (фрейме данных или матрице) с именем mylist:

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 ##
}
...