Seite 1 von 1

Separieren und Bearbeiten von einem riesen Datensatz

Verfasst: Fr Feb 09, 2018 11:18 am
von Regression
Hallo Zusammen,

da ihr mir so toll letztes mal geholfen habt, hoffe dass es auch dieses mal der Fall sein wird. :)

ich habe eigene Funktion geschrieben "evaluate" die die Daten eines Kunden berechnet.
Nun habe ich ein riesen Datensatz. Dieser hat als Spalte "CustomerName".
Jetzt möchte ich in einer Schleife dieses Datensatz für jeden Kunden auswerten und in einer gemeinsamen Tabelle speichern.
Mein Ansatz/ eher Pseudocode bis jetzt:

Code: Alles auswählen

customers<-unique(Main.Data$CustomerName)
for(i in customers){
  customerTable <- data.frame(Main.Data)
  customerTable <- customerTable[customerTable$CustomerName==customers,]
  SerialNumber  <- unique(customerTable$SerialNumber)
  for(j in serialNumber){
    
    evaluationTable[evaluate(customerTable),]
    
  }    
}
Ich möchte das "customerTable" den Namen des Kunden bekommt.
Diesen Kunden Datensatz möchte ich nun weiterverarbeiten mit meiner vordefinierten Funktion evaluate(), die als Ausgabe eine Liste hat:
evaluate ---> Liste (Wert1, Wert2, Wert3)

Insgesamt möchte ich eine Evaluationstabelle die folgende Form hat:
Kunde_1 SerialNumber_1 Wert1 Wert2 Wert3
...
Kunde_1 SerialNumber_j Wer1 Wert2 Wert3
...
Kunde_i SerialNumber_j Wert1 Wert2 Wert3

Ich Danke euch im Voraus!!!

Re: Separieren und Bearbeiten von einem riesen Datensatz

Verfasst: Fr Feb 09, 2018 12:05 pm
von jogo
Hallo Regression,

bitte schau Dir mal die Kombination L <- split(...); ergebnis <- lapply(L, ...) an. Natürlich gibt es auch by(...), aber mir persönlich gefällt die Struktur des Ergebnisobjektes von by() nicht.
Bei großen Datenmengen empfiehlt sich auch ein Blick auf das Paket data.table - allerdings muss man sich dann erstmal in eine neue Syntax (die von [.data.table) einarbeiten; dafür wird man auch mit einem enormen Geschwindigkeitszuwachs und kompaktem Code belohnt.

BTW:
Was ich nicht verstanden habe:
warum taucht in der innersten Schleife die Laufvariable j nicht auf? Wenn j in Deiner Funktion evaluate() berücksichtigt wird, sollte j als Parameter übergeben werden (... immer schön sauber bleiben :!: ).
Kann die Datentabelle, die evaluate() auswerten soll noch weiter reduziert werden auf die Zeilen, die zu einer Kombination aus customerTable$CustomerName und customerTable$SerialNumber gehören?

Gruß, Jörg

Re: Separieren und Bearbeiten von einem riesen Datensatz

Verfasst: Fr Feb 09, 2018 1:27 pm
von Regression
jogo hat geschrieben: Fr Feb 09, 2018 12:05 pm ...
BTW:
Was ich nicht verstanden habe:
warum taucht in der innersten Schleife die Laufvariable j nicht auf? Wenn j in Deiner Funktion evaluate() berücksichtigt wird, sollte j als Parameter übergeben werden (... immer schön sauber bleiben :!: ).
hast natürlich Recht :)

so sieht es vollständig aus:

Code: Alles auswählen

fncToBeDefined<-function(Main.Data){
  customers<-unique(Main.Data$CustomerName);
  evaluationTable<-data.frame();
  customerTable<-data.frame();
  lc<-c();
  ppt<-c();
  temp_Data<-data.frame();
  SerialNumber<-c();
  for (i in 1:length(customers)) {
    customerTable<-data.frame(Main.Data);
    customerTable<-customerTable[customerTable$CustomerName==customers[i],];
    SerialNumber<-unique(customerTable$SerialNumber);
    
    for (j in 1:length(SerialNumber)) {
      temp_Data<-Main.Data[Main.Data$SerialNumber==SerialNumber[i],];
      lc<-myfunc1(temp_Data);
      ppt<-myfunc2(temp_Data);
      
      evaluationTable<-rbind(evaluationTable,c(customers[i],SerialNumber[j], median(lc),ppt))
      
  }

  }
  return(evaluationTable)
  }
jogo hat geschrieben: Fr Feb 09, 2018 12:05 pm Kann die Datentabelle, die evaluate() auswerten soll noch weiter reduziert werden auf die Zeilen, die zu einer Kombination aus customerTable$CustomerName und customerTable$SerialNumber gehören?

Wie meinst du das?

LG

Re: Separieren und Bearbeiten von einem riesen Datensatz

Verfasst: Fr Feb 09, 2018 4:27 pm
von jogo
temp_Data<-Main.Data[Main.Data$SerialNumber==SerialNumber[ i ],];
Das glaub ich nicht!
Sollte nicht j der Index für SerialNumber sein?

Und die Antwort auf Deine Frage könnte vielleicht so aussehen:

Code: Alles auswählen

by(Main.Data, list(Main.Data$CustomerName, Main.Data$SerialNumber), FUN=function(X) c(lc=myfunc1(X), ppt=myfunc2(X)))
Und hier eine Variante mit data.table:

Code: Alles auswählen

library("data.table")
setDT(Main.Data)
Main.Data[, .(lc=myfunc1(.SD), ppt=myfunc2(.SD)), by=.(CustomerName, SerialNumber)]
Gruß, Jörg
p.s.:
noch eine Kleinigkeit: Semikolons werden zum Trennen nur benötigt, wenn mehrere Ausdrücke (expressions) in einer Zeile stehen.

Re: Separieren und Bearbeiten von einem riesen Datensatz

Verfasst: Mo Feb 12, 2018 8:53 am
von Regression
jogo hat geschrieben: Fr Feb 09, 2018 4:27 pm
temp_Data<-Main.Data[Main.Data$SerialNumber==SerialNumber[ i ],];
Das glaub ich nicht!
Sollte nicht j der Index für SerialNumber sein?
War ein weiterer Typo , danke!
jogo hat geschrieben: Fr Feb 09, 2018 4:27 pm Und hier eine Variante mit data.table:

Code: Alles auswählen

library("data.table")
setDT(Main.Data)
Main.Data[, .(lc=myfunc1(.SD), ppt=myfunc2(.SD)), by=.(CustomerName, SerialNumber)]
Gruß, Jörg
Perfekt! Genau so wollte ich es haben, besten Dank :!: :!: :!:
Werde mich nun in den Syntax einarbeiten.