【问题标题】:With R, loop over two files at a time使用 R,一次循环两个文件
【发布时间】:2011-10-14 17:51:50
【问题描述】:

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

我试图在 R 中一次遍历两个文件:即获取一个“案例”文件和另一个“控制”文件,创建一个图形并将其转储为 pdf,然后获取另一组 2 个文件并执行以此类推。我有一个列表,指示哪个文件是案例,哪个是控件,如下所示:

case   control
A01    G01
A02    G02
A06    G03

等等……可以这样复制: mylist

我找不到指定每次循环遍历哪两个文件的方法。 文件(每个文件都有很多变量)是:“/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和control,我想这样做:

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,不幸的是没有模式......看起来字母和数字是随机的......
  • 这里的许多事情都令人困惑。如果您有一个案例和控制文件的列表,myFiles &lt;- list.files(...) 行的用途是什么,它没有为您提供有关哪个文件属于哪种类型的信息?为什么不只遍历你已经拥有的文件列表呢?还是文件名不是简单的 12H.txt、14C.txt 等的问题,因此您必须检查文件以确定它们对应的案例/控件?
  • myFiles 有文件的路径,而案例和控制文件只是从文件名的最后部分指定哪些是案例和控制,但我当然可以将其扩展为文件名,如果这有助于...
  • @user971102 这听起来很奇怪。听起来您是在说文件名 没有区分模式 可以指示哪些是案例和控件,甚至哪些是对?这可能只有在您能够清楚地解释如何根据文件名或内容的某些特征来区分这两种类型时才能解决。

标签: r loops


【解决方案1】:

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

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] 包含第二个。请参阅上述代码的打印输出,希望可以清楚地说明。

【讨论】:

  • 嗨 gsk3,这听起来像是解决我的特定问题的好方法......但是 f[1] 给了我文件 A 和文件 B 文件,然后我如何通过选择第一个来继续循环文件 A 并对此进行计算,然后操作文件 B?抱歉无知...
  • 谢谢gsk3!!我有最后一个疑问......当我运行它时,它只给我前两个文件,而我在“文件”中指定了更多文件,你知道发生了什么吗?非常感谢.. : pdf(file='graph') for(f in files) { case
  • files的结构是什么?
  • 这是我在其余编码位中做错的事情,它可以工作!!!谢谢!!!!
【解决方案2】:

在这种情况下可能更有意义的是,从案例和控件的“列表”(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...
}

【讨论】:

  • 感谢尼克的回复。案例和控件都有不同的名称,但没有任何可预测的前缀和后缀......
  • 好吧,一旦你得到文件名列表,应该很容易找到以(例如)“14C.txt”结尾的文件名,不(如果没有,请检查?grep)?只需将“粘贴”技巧替换为“查找以结尾的文件名”技巧即可。
【解决方案3】:

假设您的案例和控件列表位于名为 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 ##
}

【讨论】:

  • 谢谢泰勒。但是,当我尝试此代码时出现错误,我确信这是因为我不太了解它。前任。 [.default(xj, i) 中的错误:无效的下标类型“列表”以及当我尝试继续使用我的脚本处理两个数据框“控制”和“案例”时出现的其他错误(例如当我尝试将数据框...),你知道我做错了什么吗?再次感谢您。
  • 我假设 mylist 是一个 data.frame 或矩阵对象。如果它是真正的 R list 类型,则需要在您的最后进行修改才能正常工作。您没有在问题中提供示例代码,因此我们必须猜测您在做什么。
  • 对不起,泰勒,我编辑了这篇文章,希望现在更清楚一点......我仍在试图弄清楚为什么你建议的代码对我不起作用..我收到这个错误:“在file(file, "rt") : 只使用了 'description' 参数的第一个元素"
猜你喜欢
  • 1970-01-01
  • 2013-11-13
  • 2019-06-02
  • 1970-01-01
  • 2016-08-08
  • 2020-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
相关资源
最近更新 更多