ошибка rbind после цикла for в R

У меня есть два файла. Файл 1 имеет 56632 строки и 4 столбца и выглядит так:

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 

Я пытаюсь запустить вложенный цикл for, чтобы найти для каждой строки в файле 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

person theo4786    schedule 23.11.2016    source источник
comment
Вы написали 3 имени столбца в своем файле 1, тогда как заявили, что в нем 4 столбца.   -  person Erdogan CEVHER    schedule 24.11.2016
comment
Это поможет, если вы сократите свой код до воспроизводимого примера в соответствии с этим: stackoverflow.com/questions/5963269/   -  person Bulat    schedule 24.11.2016
comment
Итак, вы хотите оставить в файле 2 только те строки, которые удовлетворяют вашему условию, верно? Каков ваш желаемый результат?   -  person code_is_entropy    schedule 24.11.2016


Ответы (1)


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

# 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"])))
                        })))
person code_is_entropy    schedule 23.11.2016
comment
Возможно, вам придется изменить имя столбца «TES» в первом файле на что-то другое, например, «TES1». - person code_is_entropy; 24.11.2016
comment
Спасибо. кадры входных данных немного неверны, но я смог реализовать which.min, чтобы мой код работал. - person theo4786; 28.11.2016