使用R语言,同时循环遍历两个文件

3

大家好,我是你们最喜欢的编程专家之一。

我正在尝试在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)
}

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

目录中的文件是如何组织的?文件名是否有一定的模式,例如case1.txt/control1.txt,case2.txt/control2.txt等等? - bnaul
抱歉bnaul,没有规律可言...看起来这些字母和数字都是随机的... - user971102
这里有很多令人困惑的事情。如果你有一个案例和控制文件列表,那么 myFiles <- list.files(...) 这一行的目的是什么?它并没有告诉你哪个文件属于哪种类型。为什么不直接遍历你已经拥有的文件列表呢?或者问题在于文件名不是简单的12H.txt、14C.txt等,因此你必须检查文件以确定它们对应的案例/控制? - bnaul
myFiles变量包含文件路径,而case和control文件只是指定哪些是文件名的最后一部分中的病例和对照组,但如果需要,我可以将其扩展到文件名中... - user971102
@user971102 这听起来非常奇怪。你是在说文件名没有任何区别模式,无法表明哪些是病例和对照组,甚至哪些是成对的吗?如果你不能清楚地解释如何根据文件名或内容的某些特征区分这两种类型,那么这个问题可能只能得到有限的解决。 - joran
3个回答

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的第一个元素。由于第一个元素是长度为两个的字符向量,f [1]包含一对文件名中的第一个,f [2]包含第二个。请参见上面代码的打印输出,这应该能够使其清晰易懂。

嗨gsk3,这听起来是我特定问题的好解决方案...但f[1]给了我文件A和文件B文件,然后我如何通过选择第一个文件A并对其进行计算,然后操作文件B来继续循环?对于我的无知表示抱歉... - user971102
非常感谢gsk3!! 我还有最后一个疑问...当我运行这个程序时,它只给出了前两个文件,而我已经在“文件”中指定了更多的文件,你有什么想法发生了什么?非常非常感谢..: pdf(file='graph') for(f in files ) { case<- read.table(file = f[2], sep = '\t', header = F) control<- read.table(file = f[1], sep = '\t', header = F) boxplot###和其他命令### } dev.off() - user971102
files的结构是什么? - Ari B. Friedman
这是我在其余的代码部分做错了什么,现在它能正常工作了!!谢谢您!!! - user971102

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

谢谢 Tyler,不过我在尝试这段代码时遇到了错误,我相信这是因为我对它的理解还不够。例如:Error in [.default(xj, i) : invalid subscript type 'list',当我尝试使用两个数据框“control”和“cases”继续我的脚本时(比如当我尝试子集化数据框时...),出现了其他错误...你知道我哪里做错了吗?再次感谢。 - user971102
我假设mylist是一个数据框或者矩阵对象。如果它是真正的R list类型,则需要在您的端口进行修改才能正常工作。由于您没有在问题中提供示例代码,因此我们必须猜测您正在做什么。 - Tyler
抱歉 Tyler,我编辑了帖子,希望现在更清晰了... 我仍在努力弄清楚为什么你建议的代码对我不起作用... 我得到了这个错误:“In file(file, "rt"): only first element of 'description' argument used”。 - user971102

0
在这种情况下,更有意义的做法可能是从您的病例和对照的“列表”(一个数据框架?)中构建两个文件名。
如果此“列表”存在于数据框架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...
}

谢谢Nick的回复。尽管情况和控件没有可预测的前缀和后缀,但它们都有不同的名称... - user971102
一旦你获得了文件名列表,找到以(例如)“14C.txt”结尾的文件应该很容易,不需要使用'paste'技巧,而是使用“查找以特定后缀结尾的文件名”的技巧。如果不确定,可以检查?grep - Nick Sabbe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接