2017-07-19 2 views
0

Schleife Ich möchte die folgende Schleife auf eine effiziente Weise ausführen, wie ich dies auf Millionen von Zeilen durchführen muss. BeispieldatenSchnelle und effiziente Möglichkeit, unter Code in R

a <- data.frame(x1=rep(c('a','b','c','d'),5), 
       x2=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5), 
       value1=c(rep(201,4),rep(202,4),rep(203,4),rep(204,4),rep(205,4)), 
       y1=c(rep('a',4),rep('b',4),rep('c',4),rep('d',4),rep('e',4)), 
       y2=c(1,2,3,4,2,3,4,5,3,4,5,6,4,5,6,7,5,6,7,8), 
       value2=seq(101,120), stringsAsFactors = FALSE) 

ich unten schrieb Ähnliche Werte zwischen zwei Spalten zu vergleichen und dann den Unterschied finden.

for (i in 1:length(a$x1)){ 
    for (j in 1:length(a$x1)){ 
    if(a$y1[i] == a$x1[j] & a$y2[i] == a$x2[j]){ 
     a$diff[i] <- a$value1[j] - a$value2[i] 
     break 
    } 
    } 
} 
+2

ich einige Probleme, zu verstehen, was die erwartete Ausgabe sein sollte, und ich vermute, dass es Probleme in Ihrer For-Schleife gibt. Können Sie Ihre Frage bearbeiten, um zu zeigen, wie die Ausgabespalte "diff" in Ihrem Beispiel aussehen soll? –

+0

Sind Sie sicher, dass das von Ihnen angegebene Beispiel korrekt ist? zum Beispiel wenn ich = 15 – Wen

+0

Ich verpasste Break-Anweisung, die ich jetzt bearbeitet habe. Danke für das Aufzeigen. – Lufy

Antwort

0

Für jedes i, sind Sie die erste j zu finden, so dass a$y1[i] == a$x1[j] && a$y2[i] == a$x2[j] (im Code, gibt es & statt && was offensichtlich falsch ist).

Wenn a$x1, a$x2, a$y1, a$y2 sind entweder Zahlen oder Zeichendaten ohne Leerzeichen (wie in Ihrem Beispiel), Sie

x12 = paste(a$x1, a$x2) 
y12 = paste(a$y1, a$y2) 

dann für jedes i verwenden könnte, sind Sie die ersten j so finden dass x12[i]==y12[j]

Sie tun es mit match(x12, y12).

So können Sie etwas tun:

x12 = paste(a$x1, a$x2) 
y12 = paste(a$y1, a$y2) 
m = match(x12, y12) 
for (i in seql(m)) 
    if (!is.na(m[i])) 
     a$diff[i] <- a$value1[m[i]] - a$value2[i] 

Sie können die letzte Schleife wie folgt beseitigen:

x12 = paste(a$x1, a$x2) 
y12 = paste(a$y1, a$y2) 
m = match(x12, y12) 
good.i = which(!is.na(m)) 
a$diff[good.i] <- a$value1[m[good.i]] - a$value2[good.i] 
Verwandte Themen