2014-10-04 50 views
-1

我有很多包含基因表達數據的文件。在每個文件中,基因名稱保存在「Gene_symbol」列中,表達量度(實數)保存在列「RPKM」中。文件名由一個標識符,後跟_和剩下的名稱(以「expression.txt」結尾)組成。我想將所有這些文件加載​​到R中作爲數據幀,對於每個數據幀,用原始文件的標識符重命名列「RPKM」,然後通過「Gene_symbol」將數據幀加入一個大數據幀「Gene_symbol」後跟所有具有來自單個文件的表達度量的列,每個列都標有原始標識符。如何用R中的部分數據幀標識符重命名數據幀的列?

我已經設法將原始文件的標識符轉換爲各個數據幀的名稱,如下所示。

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")])} 

所以現在我在一個階段,我有dataframes如下:

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)) 

但我似乎並沒有能夠將RPKM柱與id000x位重命名。 (當然,這是完全自動化的方式,循環遍歷我將在真實場景中生成的所有數據幀。)

我試圖將標識符位存儲爲數據幀的註釋,但似乎是無法從循環內分配評論。

任何幫助,將不勝感激,

MCE

+0

一個辦法是分配給開始之前做到這一點。 'tmp < - read.table(i,header = TRUE)[,c(「Gene_symbol」,「RPKM」)]; names(tmp)[2] < - strsplit(i,「_」)[[1]] [1];分配(var_name,tmp)'。也就是說,將多個數據幀分配到當前環境中可能不是最佳解決方案。用'lapply'將數據讀入'list'將會更加R-like。另外,還不清楚你是如何訪問這些數據框架的(例如用'get'?你知道他們的名字,還是像'ls'一樣依賴於某個想法?) – GSee 2014-10-04 21:48:10

回答

1

你應該從未工作這種方式R.您應儘量保持你的所有的數據幀中的列表,並使用功能,如對他們工作lapply等。因此,而不是使用assign,您只需建立files列表的長度的空單並與for循環填充

對於您目前的情況,我們可以使用固定它和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爲了讓他們回到地球環境,但你應該謹慎使用

+0

+1,但我實際上認爲'for'循環會使更多的意見在這裏,因爲你只是循環的副作用。另外,'<< - '可能有點危險。 – GSee 2014-10-04 22:02:50

+0

@是的,我同意這兩點,但似乎'' - '在詞法範圍內運行(可能是因爲它在'lapply'內),即使你傳遞的數據集少於兩列,它不會覆蓋全局環境中具有相同名稱的數據集 – 2014-10-04 22:09:46

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")