2016-11-23 2 views
0

두 개의 파일이 있습니다. 파일 1은 56,632 행과 4 열이 있고, 다음과 같습니다for 루프에서 rbind 오류가 발생했습니다.

Id Chr TSS TES 
ENSG00000210049 1 63987904 63989904 
ENSG00000211459 1 63984904 63985904 
ENSG00000210077 1 58941831 58991831 

그리고 2 28,895 행과 3 열이 파일과 같다 : 내가 루프 중첩을 실행하려고

CHR snps POS    
1 rs17125090 63988904 
1 rs7546938 64677853 
1 rs3087585 58971831 

파일 2의 모든 행에 대해 파일 1의 필드 2가 파일 2의 필드 3의 값에 가장 가까운 필드 3의 값을 가진 파일 1의 행을 찾 으려면 파일 1의 필드 2와 파일 2의 필드 1을 사용합니다 일치합니다. 내 코드는 다음과 같습니다

genes<-read.table("file1",header=T) 
snps<-read.table("file2",header=T) 

df<-data.frame() 

for(i in 1:10){ 
    i.genes<-data.frame() 
    i.dist<-data.frame() 
    for(j in 1:56632){ 
     if((snps[i,1]==genes[j,2]) & (abs(snps[i,3]-genes[j,3])<2000000)){ 
      i.genes<-rbind(i.genes,genes[j,1:3]) 
      i.dist<-rbind(i.dist,abs(genes[j,3]-snps[i,3])) 
      i.df<-cbind(i.genes,i.dist) 
     } 
    } 
    i.df<-i.df[order(i.df[,4]),] 
    i.df<-i.df[1,] 
    i.df2<-cbind(snps[i,1:3],i.df) 
    colnames(i.df2)<-NULL 
    df<-rbind.data.frame(df,i.df2) 
} 
write.table(df,"test.df",quote=F,row.names=F) 

내가 선 df<-rbind.data.frame(df,i.df2)에 대한 오류 Error in pi[[j]] : subscript out of bounds 받고 있어요. 누군가 잘못 될 수 있음을 지적 할 수 있습니까?

원하는 출력 :이 당신을 위해 무엇을 찾고있는 것 같다

1 rs17125090 63988904 ENSG00000210049 1 63987904 1000 
1 rs7546938 64677853 ENSG00000210049 1 63987904 689949 
1 rs3087585 58971831 ENSG00000210077 1 58941831 30000 
+0

1은 4 열로 표시되어 있습니다. –

+0

코드를 다음과 같이 재현 가능한 예제로 줄이면 도움이됩니다. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Bulat

+0

당신의 조건을 만족시키는 파일 2의 행 들이죠? 원하는 출력은 무엇입니까? –

답변

0

(내가 그것으로 예상보다 약간 긴입니다) - 당신은 당신의 파일에 3 열 이름을 썼다

# First file as a data frame 
df1 <- data.frame("Id"=c("ENSG00000210049","ENSG00000211459","ENSG00000210077"), 
       "Chr"=c(1,1,1), "TSS"=c(63987904,63984904,58941831)) 

# Second file as a data frame 
df2 <- data.frame("CHR"=c(1,1,1), "snps"=c("rs17125090","rs7546938","rs3087585"), 
       "TES"=c(63988904,64677853,58971831)) 

# Join matching rows in second file 
df2[c(names(df1),"diff")] <- data.frame(t(sapply(seq_along(df2$TES), function(x) 
         { 
         cbind(df1[which.min(abs(df2[x,"TES"] - df1[df1$Chr %in% df2[x,"CHR"], "TSS"])),], 
           min(abs(df2[x,"TES"] - df1[df1$Chr %in% df2[x,"CHR"], "TSS"]))) 
         }))) 
+0

첫 번째 파일의 열 이름 'TES'를 다른 이름 (예 : 'TES1')으로 변경해야 할 수 있습니다. 덕분에 –

+0

. 입력 데이터 프레임은 약간 잘못되었지만 코드 작성을 위해 which.min을 구현할 수있었습니다. – theo4786

관련 문제