2016-10-07 5 views
0

Ich habe zwei Datensätze mit 24k und 15k Zeilen. Ich habe verschachtelte for-Schleifen verwendet, um einige Daten neu zu schreiben ... aber es dauert ewig, um die Operation zu berechnen.Optimieren der Verarbeitungszeit in den verschachtelten For-Schleifen - R

hat jemand einen Vorschlag, wie man den Code optimieren kann, um den Prozess zu beschleunigen?

mein Code:

for(i in 1:length(data$kolicina)){ 
    for(j in 1:length(df$kolicina)){ 
    if(data$LIXcode[i] == df$LIXcode[j]){ 
     data$kolicina[i] <- df$kolicina[j] 
    } 
    } 
} 

der vollständige Code mit dem imput wie folgt aussieht:

df <- data[grepl("Trennscheiben", data$a_naziv) & data$SestavKolicina > 1,] 
for(i in 1:length(df$kolicina)){ 
    df$kolicina[i] <- df$kolicina[i]/10 
} 

for(i in 1:length(data$kolicina)){ 
    for(j in 1:length(df$kolicina)){ 
    if(data$LIXcode[i] == df$LIXcode[j]){ 
     data$kolicina[i] <- df$kolicina[j] 
    } 
    } 
} 

die Daten:

LIXcode   a_naziv     RacunCenaNaEM kolicina 
LIX2017396957 MINI HVLP Spritzpistole 20,16   1 
LIX2017396957 MINI HVLP Spritzpistole 20,16   1 
LIX2017396963 Trennscheiben Ø115 Ø12 12,53   30 
LIX2017396963 Trennscheiben Ø115 Ø12 12,53   1 
+0

Könnten Sie Code, der Eingang und eine Tabelle erzeugt, die repr Gibt die Ausgabe aus? Die meisten Probleme können gelöst werden, ohne auf eine Schleife zurückgreifen zu müssen ... oder, im schlimmsten Fall, mit anwendungsfamilie. –

+0

@ A.Val. Ich habe die Frage aktualisiert ... –

+0

Lassen Sie mich meinen obigen Kommentar in anderer Perspektive setzen. Würde mir das Ausführen Ihres Codes irgendeine Ausgabe liefern? Ich habe versucht, Ihnen einen Tipp in meiner Antwort zu geben - Ich habe Zeile, die benötigt Bibliotheken laufen, ich habe Code, der Daten generiert und ich habe basierend darauf ausgegeben ... –

Antwort

0

ich das alleine nicht versucht haben, Maschine, aber das sollte funktionieren

fun <- function(x,y){ 
    x[which(x$LIXcode %in% y$LIXcode)]$kolicina = 
    y[which(x$LIXcode %in% y$LIXcode)]$kolicina 
    } 
} 

fun(data,df) 

R hat die Fähigkeit, sie alle parallel

0

Soweit ich verstehe, die Frage betrifft Tabelle „DT1“ mit Schlüsselspalte „a“ und eine beliebige Anzahl von Wertspalten und eine beliebige Anzahl von Beobachtungen zu tun. Und dann haben wir eine "dt2", die eine Art von Mapping hat - was bedeutet, dass Spalte "a" eindeutige Werte hat und einige Spalte "b" hat Werte, die in "dt1" geschrieben werden müssen, wo Spalten "a" übereinstimmen.

Ich würde vorschlagen, Tabellen verknüpft:

require(data.table) 

dt1 <- data.table(a = sample(1:10, 1000, replace = T), 
      b = sample(letters, 1000, replace = T)) 

dt2 <- data.table(a = 1:10, 
        b = letters[1:10]) 

output <- merge(dt1, dt2, by = "a", all.x = T) 

Sie können auch versuchen:

dt1[,new_value:=dt2$b[match(a, dt2$a)] 

Beide Lösungen sind vektorisiert, deshalb fast sofort.

Basislösung (keine data.table Syntax, obwohl ich würde empfehlen Ihnen, es zu lernen):

dt1$new_value <- dt2$b[match(dt1$a, dt2$a)] 

Und das ist, wenn ich die Frage richtig verstanden ...


hier ist eine funktionierende Lösung für erwartete Ausgabe aufzunehmen:

dt1[a %in% dt2$a, b:=dt2$b[match(a, dt2$a)]] 
+0

Hallo, ich habe versucht, Ihre Lösungen, aber die Ausgabe ist unerwünscht. Ausgabe <- merge (dt1, dt2, durch = "a", all.x = T). -> Das führt doppelte Datensätze zusammen und verdoppeln die Spalten im Grunde. dt1 $ new_value <- dt2 $ b [Übereinstimmung (dt1 $ a, dt2 $ a)] -> damit bekomme ich die richtigen Werte, aber der Rest der Daten ist jetzt NAs. Aber es sollte gleich bleiben. Danke für Ihre Eingabe, aber ich konnte es einfach nicht lösen. –

+0

Zumindest weiß ich jetzt endlich, wie Sie die Ausgabe sehen wollen. Lass es mich ein bisschen reparieren. –

Verwandte Themen