2014-11-13 2 views
0

Это вопрос R.значение замены в одной матрице на основе условия в другой матрице

У меня есть две матрицы, «у» и «л»:

> head(y) 
    SNP Category 
1 29351 exclude 
2 29357 exclude 
3 29360 exclude 
4 29372 include 
5 29426 include 
6 29432 include 

> head(l) 
    start stop 
1 246 11012 
2 11494 13979 
3 14309 18422 
4 20728 20995 
5 21457 29345 
6 30035 31693 

Если строка в матрице у имеет значение «включать» во втором столбце, я хочу проверить, если соответствующее значение в первый столбец в матрице y лежит на значении «start» и «stop» в матрице l или между ними. Если значение в матрице y лежит на значениях в матрице l или между ними, то в матрице y замените значение «include» на «exclude». Думаю, я мог бы сделать это с вложенными петлями, но хотел знать более элегантный и более быстрый способ. Матрицы имеют неравную длину. Спасибо.

+0

Я мог бы рассмотреть возможность слияния, как те, предложенное [здесь] (http://stackoverflow.com/questions/24480031/roll-join-with-start-end-window) – MrFlick

ответ

0

Это сработало, но было медленным.

y <- read.csv(file="SNP_pos_categorised0.99cutoff.csv", header=T) 
l <- read.csv("SNPsToMoveFromINCLUDEtoEXCLUDE.csv", header=T) 

colnames(y) 
#[1] "SNP"  "Category" 

levels(y$Category) 
#[1] " exclude" " include" 

colnames(l) 
#[1] "start" "stop" 

#start processing 
for(i in 1:nrow(y)) 
{ 
    if(y[i,"Category"]==" include") 
    { 
     for(j in 1:nrow(l)) 
     { 
      if(y[i,"SNP"] >= l[j,"start"] & y[i,"SNP"]<= l[j,"stop"]) 
      { 
       y[i, "Category"] <- replace(y[i,"Category"], y[i,"Category"]==" include", " exclude") 
      } 
     } 
    } 
} 
Смежные вопросы