2014-10-04 2 views
-1

유전자 발현 데이터를 포함하고있는 여러 파일이 있습니다. 각 파일에서 유전자 이름은 "Gene_symbol"열에 보관되고 표현식 측정 값 (실수)은 "RPKM"열에 보관됩니다. 파일 이름은 식별자 뒤에 _ 및 나머지 이름 ("expression.txt"로 끝남)으로 구성됩니다. 이러한 모든 파일을 R에 데이터 프레임으로로드하려면 각 데이터 프레임에 대해 원본 파일의 식별자로 "RPKM"열의 이름을 바꾸고 "Gene_symbol"에 의해 데이터 프레임을 하나의 열과 함께 하나의 큰 데이터 프레임에 조인합니다 "Gene_symbol"다음에는 각 파일의 표현 측정 값이있는 모든 열이옵니다. 각 파일은 원래 식별자로 레이블되어 있습니다.R에서 데이터 프레임 식별자의 일부로 데이터 프레임의 열 이름을 바꾸는 방법은 무엇입니까?

원본 파일의 식별자를 다음과 같이 개별 데이터 프레임의 이름으로 전송할 수있었습니다.

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 열 이름을 바꿀 수있을 것하지 않는 다음과 같이 내가 dataframes이 곳

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

그래서 지금은 무대에 있어요. (물론 완전히 자동화 된 방식으로 실제 시나리오에서 생성 할 모든 데이터 프레임을 반복합니다.)

데이터 프레임에 식별자 비트를 주석으로 저장하려고 시도했지만 루프 내에서 주석을 할당 할 수 없습니다. 어떤 도움을 주시면 감사하겠습니다

,

MCE

+0

한 가지 방법은 우선 할당하기 전에 그것을 할 것입니다. 'tmp <- read.table (i, header = TRUE) [, c ("Gene_symbol", "RPKM")]; names (tmp) [2] <- strsplit (i, "_") [[1]] [1]; 할당 (var_name, tmp)'. 즉, 현재 환경에 여러 data.frames를 할당하는 것이 최상의 솔루션이 아닐 수도 있습니다. 'lapply'를 사용하여'list '에 데이터를 읽는 것이 R 형이 될 것입니다. 또한이 데이터에 액세스하는 방법이 명확하지 않습니다. 예를 들어'get'을 사용하거나 이름을 알고 계시거나'ls'와 같은 생각에 의지하십니까?) – GSee

답변

1

당신이해야 결코 작업 당신은 항상 목록에있는 모든 데이터 프레임을 유지하려고하고 같은 기능을 사용하여에서 동작한다 R.에서이 방법 lapply 등 따라서, 대신 assign를 사용하는 당신의 files 목록의 길이의 빈 목록을 작성하고 현재 상황에 for 루프

그것을 채우기, 우리는 0,123,369을 사용하여 고정 할 수 있습니다및 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, 루프는 부작용에 대해서만 반복하기 때문에 여기에 더 많은 의미가 있습니다. 또한,'<< -'는 약간 위험 할 수 있습니다. – GSee

+0

@GSee 그래, 나는 양쪽 점 모두에 동의한다. 그러나'<< -'가 어휘 범위 내에서 작동하는 것처럼 보인다. (아마도'lapply '안에 있기 때문에) 그리고 2 열 미만의 데이터 세트를 전달하더라도 전역 환경에서 동일한 이름을 가진 데이터 집합을 재정의하지 않습니다. –

0

덕분에 많이 사용한다! 나는 요점을 얻는다 고 생각한다. 내가 지금하고있는 방식 (아래 참조)은 잘하면 더 많은 R과 같고 잘 작동한다!

건배,

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") 
관련 문제