2017-03-29 2 views
1

J'écris un code court qui compare deux dataframes- list & knownlocation. Je veux savoir pour chaque élément dans la liste, si elle se trouve dans un emplacement connu.if instruction within double for loop: exemple spécifique

colnames(list) <- c("gene_symbol", "chromo", "start", "end") 
colnames(knownlocation) <- c("snp", "chr", "s", "e") 

Pour trouver ce que j'ai écrit le code pour faire une nouvelle colonne dans « liste » dit VRAI ou FAUX que ce soit dans l'une des knownlocation:

for (i in 1:nrow(list)) { 
for (j in 1:nrow(knownlocation)) { 
if ((list[i, 2] == knownlocation[j, 2]) && (list[i, 3] >= knownlocation[j, 3]) && (list[i, 4] <= knownlocation[j, 4])) { 
list[i, 5] = "TRUE" } 
else { list[i, 5] = "FALSE"} 
}} 

Ce code semble bien pour moi et il court sans erreurs. Le problème est que la liste entière montre FAUX, même si elle tombe dans un emplacement dans l'emplacement connu. Quelqu'un peut-il trouver quelque chose de manifestement faux que j'ai manqué?

Répondre

1

Le problème est la clause else qui remplacera avec FALSE sur les instances précédentes où TRUE a été trouvé. Fondamentalement, vous voulez seulement stocker TRUE lorsque la condition est remplie, mais initialiser toutes les valeurs à FALSE avant l'exécution de la boucle.

Essayez de supprimer la clause else.

Pour initialiser la colonne 5 du list avec FALSE faire le droit suivant avant le looping imbriqué:

list$V5 = FALSE 

code:

list$V5=TRUE 
for (i in 1:nrow(list)) { 
    for (j in 1:nrow(knownlocation)) { 
    if ((list[i, 2] == knownlocation[j, 2]) && (list[i, 3] >= knownlocation[j, 3]) && (list[i, 4] <= knownlocation[j, 4])) { 
     list[i, 5] = "TRUE" } 
} 
+0

cela fonctionne Merci, parfaitement. – user6137877