我有很多包含基因表达数据的文件。在每个文件中,基因名称保存在一列" Gene_symbol"表达式度量(实数)保存在一列" RPKM"中。文件名由一个后跟_的名称和名称的其余部分组成(以" expression.txt"结尾)。我想将所有这些文件作为数据帧加载到R中,为每个数据帧重命名列" RPKM"使用原始文件的标识符然后通过" Gene_symbol"加入数据帧。一个大型数据框,一列#34; Gene_symbol"然后是所有列,其中包含来自各个文件的表达式度量值,每个列都标有原始标识符。
我设法将原始文件的标识符传输到各个数据帧的名称,如下所示。
files <- list.files(pattern = "expression.txt$")
for (i in files) {var_name = paste("Data", strsplit(i, "_")[[1]][1], sep = "_"); assign(var_name, read.table(i, header=TRUE)[,c("Gene_symbol", "RPKM")])}
所以现在我处于数据帧如下的阶段:
Data_id0001 <- data.frame(Gene_symbol=c("geneA","geneB","geneC"),RPKM=c(2.43,5.24,6.53))
Data_id0002 <- data.frame(Gene_symbol=c("geneA","geneB","geneC"),RPKM=c(4.53,1.07,2.44))
但是我似乎无法用id000x位重命名RPKM列。 (当然,这是一种完全自动化的方式,循环遍历我将在真实场景中生成的所有数据帧。)
我尝试将标识符位存储为带有数据框的注释,但似乎无法在循环内分配注释。
任何帮助将不胜感激,
MCE
答案 0 :(得分:1)
你应该lapply
等功能对它们进行操作。因此,而不是使用assign
,只需创建一个包含files
列表长度的空列表,并使用for
循环填充
对于您目前的情况,我们可以使用ls
和mget
组合修复它,以便将此数据框从全局环境中提取到列表中,然后更改感兴趣的列。
temp <- mget(ls(pattern = "Data_id\\d+$"))
lapply(names(temp), function(x) names(temp[[x]])[2] <<- gsub("Data_", "", x))
temp
#$Data_id0001
# Gene_symbol id0001
# 1 geneA 2.43
# 2 geneB 5.24
# 3 geneC 6.53
#
# $Data_id0002
# Gene_symbol id0002
# 1 geneA 4.53
# 2 geneB 1.07
# 3 geneC 2.44
您最终可以使用list2env
让他们回到全球环境,但您应该谨慎使用
答案 1 :(得分:0)
非常感谢您的建议!我想我明白了。我现在这样做的方式(见下文)希望更像R-like并且工作正常!!!
干杯,
MAIK
library(plyr)
files <- list.files(pattern = "expression.txt$")
temp <- list()
for (i in 1:length(files)) {temp[[i]]=read.table(files[i], header=TRUE)[,c("Gene_symbol", "RPKM")]}
for (i in 1:length(temp)) {temp[[i]]=rename(temp[[i]], c("RPKM"=strsplit(files[i], "_")[[1]][1]))}
combined_expression <- join_all(temp, by="Gene_symbol", type="full")