2016-11-23 6 views
0

У меня есть два файла. Файл 1 имеет 56632 строк и 4 столбцов, и выглядит следующим образом:rbind error after for loop in R

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

и файл 2 имеет 28895 строк и 3 столбцов, и выглядит следующим образом:

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

Я пытаюсь запустить вложенный цикл чтобы найти для каждой строки в файле 2 строку в файле 1, которая имеет значение в поле 3, которое ближе всего к значению в поле 3 из файла 2, учитывая, что поле 2 из файла 1 и поле 1 из файла 2 соответствуют. Мой код:

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) 

Я получаю ошибку Error in pi[[j]] : subscript out of bounds для линии df<-rbind.data.frame(df,i.df2). Может кто-нибудь указать, что происходит не так?

Желаемый результат:

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

Вы написали 3 имена столбцов в вашем файле 1, тогда как указано, что оно имеет 4 столбца. –

+0

Это поможет, если вы уменьшите свой код до воспроизводимого примера в соответствии с этим: http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example – Bulat

+0

Таким образом, вы хотите сохранить только эти строки в файле 2, которые удовлетворяют вашему условию, правильно? Каков ваш желаемый результат? –

ответ

0

Я думаю, это то, что вы ищете (это немного длительнее, чем я ожидал, что это будет) -

# 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