繁体   English   中英

对从 R 中的 .txt 文件导入的一系列变量使用循环 for()

[英]Using a loop for() on a serie of variables imported from .txt files in R

我是 R 的新手并尝试优化脚本。 我有一个非常基本的脚本,可以从 a.txt 文件中导入数据,并在几次操作后保存数据的箱线图。 由于我必须为许多变量重复相同的脚本,我试图在 R 中构建我的第一个循环。

genes <- c("gene1", "gene2")
for(i in genes){
i <- read.table(file="i.txt", header=T, sep="\t")#load data from a file
i_adipose_c <- subset(i, Tissue == "adipose-cancer", select = c("Tissue", "Expression_level"))#select column needed
i_adipose_n <- subset(i, Tissue == "adipose-normal", select = c("Tissue", "Expression_level"))#select column needed
i_adipose_c <- i_adipose_c[, "adipose_c"]#change dataframe into vector of integers
i_adipose_n <- i_adipose_n[, "adipose_n"]#change dataframe into vector of integers
sq <- seq(max(length(i_adipose_c), length(i_adipose_n)))#define the max lengh of the 2 vectors
i_adipose <- data.frame(i_adipose_c[sq], i_adipose_n[sq])#merge the 2 vectors according to max length using na for missing values
png(filename="i_adipose_graph.png", res = 300, units = "px", width = 3000, height = 1600)
par(mar=c(15,5,1,1))
boxplot(i_adipose, las=2, ylab = "i Gene expression")
dev.off() 
}

此代码返回以下错误:

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
In file(file, "rt") : cannot open file 'i.txt': No such file or directory

我想这意味着我的循环不理解它必须用基因向量中的名称替换“i”。

我怎么解决这个问题?

感谢! (非常欢迎任何其他优化!)

您不能将i在循环中定义的变量用作文件名中的字符向量。

让我解释一下,当你写for (i in genes)时,这意味着每次代码循环时, i都会被赋予一个基于genes的新值。 在您的示例中, i将成为gene1 ,然后gene2

genes = c("gene1","gene2")

> for(i in genes){print(i)}
[1] "gene1"
[1] "gene2"

但是,当您编写file = "i.txt"时,R 正在寻找打开一个名为i.txt的文件。

如果要打开一个名为gene1.txtgene2.txt的文本文件,需要输入: file = paste0(i,".txt") 所以,现在, R 正在寻找一个文件,该文件是i (因此是gene1 )+ .txt给出的连接文件gene1.txt

> for(i in genes){print(paste0(i,".txt"))}
[1] "gene1.txt"
[1] "gene2.txt"

因此,首先,您必须查找您的文本文件名。 如果您的文本文件名为gene1.txtgene2.txt ,那么您可以使用您的代码执行以下操作:

genes <- c("gene1", "gene2")
for(i in genes){
  data <- read.table(file=paste0(i,".txt"), header=T, sep="\t")#load data from a file

  assign(i,data,.GlobalEnv) # See explanations at the end of the answer

  data_adipose_c <- subset(data, Tissue == "adipose-cancer", select = c("Tissue", "Expression_level"))#select column needed
  data_adipose_n <- subset(data, Tissue == "adipose-normal", select = c("Tissue", "Expression_level"))#select column needed
  data_adipose_c <- data_adipose_c[, "adipose_c"]#change dataframe into vector of integers
  data_adipose_n <- data_adipose_n[, "adipose_n"]#change dataframe into vector of integers
  sq <- seq(max(length(data_adipose_c), length(data_adipose_n)))#define the max lengh of the 2 vectors
  data_adipose <- data.frame(data_adipose_c[sq], data_adipose_n[sq])#merge the 2 vectors according to max length using na for missing values
  png(filename=paste0(i,"_adipose_graph.png"), res = 300, units = "px", width = 3000, height = 1600)
  par(mar=c(15,5,1,1))
  boxplot(i_adipose, las=2, ylab = paste0(i," Gene expression"))
  graphics.off() 
}

我还将打开的文本文件的分配修改为 i 因为您希望将 i 的值回收为gene1gene2以保存您的箱线图并添加图例。 当您写: i <- read.table(file="i.txt", header=T, sep="\t")时, i将成为您打开的 dataframe (文本文件中包含的所有值)并赢得'不再是i = gene1

使用assign将复制dataassigni定义的名称(此处gene1gene2 )。 像这样,您的数据将以名称gene1gene2存在于您的环境中,并且不会被for 循环的下一次迭代替换。

让我知道您是否不清楚

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM