2016-07-06 10 views
0

Ich habe zwei Zeichen Vektoren a, b mit verschiedenen Dimensionen. Ich muss jedes Element in a nehmen und mit allen Elementen in b vergleichen und das Element notieren, wenn es eine enge Übereinstimmung gibt. Für die Übereinstimmung verwende ich agrepl Funktion.Schleife durch 2 Vektoren unterschiedlicher Dimension in R

verfolgt die Beispieldaten

a <- c("US","Canada","United States","United States of America") 
b <- c("United States","U.S","United States","Canada", "America", "Spain") 

Es folgt der Code, den ich passend bin mit. Bitte helfen Sie mir, wie for-Schleife zu vermeiden, wie meine wirklichen Daten mehr 900 und 5000 Datensätze enthalten jeweils

for(i in 1:4) 
{ 
    for(j in 1:6) 
    { 
     bFlag <- agrepl(a[i],b[j], max.distance = 0.1,ignore.case = TRUE) 

     if(bFlag) 
     { 
     #Custom logic 
     } 
     else 
     { 
     #Custom logic 
     } 
    } 
} 

Antwort

0

Sie benötigen keine doppelte Schleife benötigen, da agrepl ‚s zweites Argument Vektoren der Länge akzeptiert> = 1. So Sie könnte so etwas wie tun:

lapply(a, function(x) agrepl(x, b, max.distance = 0.1, ignore.case = TRUE)) 
# [[1]] 
# [1] TRUE TRUE TRUE FALSE FALSE TRUE 
# 
# [[2]] 
# [1] FALSE FALSE FALSE TRUE FALSE FALSE 
# 
# [[3]] 
# [1] TRUE FALSE TRUE FALSE FALSE FALSE 
# 
# [[4]] 
# [1] FALSE FALSE FALSE FALSE FALSE FALSE 

Sie einige benutzerdefinierte Logik innerhalb des lapply Anruf hinzufügen kann, wenn nötig, aber das ist nicht in der Frage angegeben, so werde ich nur die Ausgabe als Liste von logical s verlassen.

Wenn Sie Indizes (von Trues) statt Logicals, Sie agrep statt agrepl verwenden:

lapply(a, function(x) agrep(x, b, max.distance = 0.1,ignore.case = TRUE)) 

# [[1]] 
# [1] 1 2 3 6 
# 
# [[2]] 
# [1] 4 
# 
# [[3]] 
# [1] 1 3 
# 
# [[4]] 
# integer(0) 

Wenn Sie nur die erste TRUE Index möchten, können Sie verwenden:

sapply(a, function(x) agrep(x, b, max.distance = 0.1,ignore.case = TRUE)[1]) 
# US     Canada   United States United States of America 
# 1      4      1      NA 
+0

Vielen Dank...!!! Ich erwarte einen entsprechenden Index des Elements in Vektor b, wenn es wahr ist. Erster richtiger Index ist ausreichend – Naveen

+0

@Naveen, wenn Sie Indizes wollen, benutzen Sie einfach 'agrep' anstelle von' agrepl' im Beispiel –

Verwandte Themen