Data.table mit unterschiedlichen Ergebnissen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Data.table mit unterschiedlichen Ergebnissen

Beitrag von Regression »

Hallo Zusammen,

ich hoffe auf die große Erfahrung von euch.
Ich habe ein recht kurioses Problem (aus meiner Sicht).

ich habe eine Funktion definiert, date_forecast
Führe ich die Funktion separat abhängig von der Variable V1 aus spukt es mir richtige Datum aus (das auch zu erwarten ist)

Führe ich allerdings folgenden Befehl aus:
Result<-Working.Data[,.(date_forecast(.SD)), by=V1]

kommen ganz andere Daten raus! Wie kann das sein?! Ist bei der Sortierung /Ordnung von V1 was durcheinander gekommen?

Bin komplett ratlos...

Besten Danke im Voraus!
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von jogo »

Regression hat geschrieben: Fr Mär 02, 2018 11:02 am Führe ich die Funktion separat abhängig von der Variable V1 aus spukt es mir richtige Datum aus (das auch zu erwarten ist)
Die data.table-Variante hast Du uns gezeigt. Kannst Du uns auch diese erste Variante zeigen, damit wir sehen können, ob die Unterteilungen in Gruppen entsprechend der Variable $V1 in beiden Varianten in gleicher Weise verläuft.
Eventuell wirst Du uns auch die Funktion date_forecast() zeigen müssen.

Und denke bitte daran, bei Deiner nächsten Nachricht Code-Stücke entsprechend zu formatieren :!:
viewtopic.php?f=20&t=29

Gruß, Jörg
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von Regression »

Gerne:
Sei:
V1[1]="AA" (Ist kein Code, sondern nur die Beispielhafte Ausgabe des ersten Eintrages)

Code: Alles auswählen

Test_Satz<-Working.Data[V1=="AA"]
Test_Date<-date_forecast(Test_Satz)
bekommt man ein Datum was auch zu erwarten wäre.

Führt man aber die Funktion innerhalb einer data.table wie folgt aus:

Code: Alles auswählen

Result<-Working.Data[,.(date_forecast(.SD)), by=V1]
Kommt an der ersten Stelle von V1[1] ebenfalls Kategorie "AA" vor aber das Datum stimmt nicht überein.

UUUUND:

Code: Alles auswählen

Date_Forecast<-by(Working.Data, list(Working.Data$V1), FUN=function(X) c(date=date_forecast(X), TRUE))
Hier kommen wieder die Daten die auch mit Test_Date übereinstimmen :roll:

Ich hoffe es ist etwas verständlicher geworden.

Besten Dank!
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von jogo »

Hallo Regression,

momentan sehe ich nicht, woran es liegen könnte.
Wenn das Phänomen reproduzieren könnte, könnte ich dazu mehr sagen.

Ansonsten nur der allgemeine Ratschlag:
1. die R-Session beenden und R neu starten
2. keine überflüssigen Objekte generieren.

Gruß, Jörg
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von Regression »

Restart hat leider nicht geholfen...

Anbei füge ich mal einen Beispiel_Satz ein.
Example_Set.xlsx
(15.03 KiB) 50-mal heruntergeladen
hier ist meine etwas umfangreichere Funktion:

Code: Alles auswählen

date_forecast<-function(Main.Data,Level_alert=10){
  Main.Data<-Main.Data[!duplicated(Date)]
 
  Level_diff<-diff(Main.Data$Level)
  Level_diff<-c(0,Level_diff) # Längen anpassung
  
  Test<-data.frame(Main.Data,Level_diff) 
  Flanken<-data.frame(Test[Test$Level_diff>0,])
  Flanken<-Flanken[Flanken$Level>60,]
  temp<-c()
  t<-Main.Data$Date
  
  zeilen<-which(t==Flanken$Date[1])
  if(length(Flanken$Date)>1){
    for (i in 2:length(Flanken$Date)) {
      temp<-which(t==Flanken$Date[i])
      if((temp[1]-zeilen[length(zeilen)])>15){
        zeilen<-c(zeilen, temp)
      }else{next}
    }}
  
  
  if(length(zeilen)<1 & length(Main.Data$Level)>=10){
      lm1.model<- lm(Main.Data$Date~Main.Data$Level)
      level_al<-lm1.model$coefficients[1]+(Level_alert*lm1.model$coefficients[2])
      forecast_alert<-as.Date(level_al,origin = "1970-01-01")
  }
  else{forecast_alert<-"insufficient Data"}

      if(length(zeilen)>0){
        last_flanc<-Main.Data[last(zeilen):length(Main.Data$V1),]
           if(length(last_flanc$V1)>=10){
         lm1.model<- lm(last_flanc$Date~last_flanc$Level)
         level_al<-lm1.model$coefficients[1]+(Level_alert*lm1.model$coefficients[2])
         forecast_alert<-as.Date(level_al,origin = "1970-01-01")
        }else{forecast_alert<-"insufficient Data"}
      }

  forecast_alert<-as.character(forecast_alert)
  
  return(forecast_alert)
}
Hoffe es ist kein Overkill jetzt... bin wirklich verzweifelt:

Code: Alles auswählen

satz<-Example_Set[V1=="00353874-129C-4FFB-AC0E-B24F7E245118"]
 date_forecast(satz)
bekomme ich den 09.09.2018 raus
Mit

Code: Alles auswählen

Example_set[,.(date_forecast(.SD)), by=.(V1)]
erhalte ich "insufficient Data".
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von jogo »

Kannst Du bitte zeigen, wie die Exceltabelle eingelesen wird. Da gibt es sehr verschiedenen Möglichkeiten ...
Die Funktion ist ja schon ein ganz schöner Hammer. :shock:

Gruß, Jörg
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von Regression »

jogo hat geschrieben: Fr Mär 02, 2018 3:27 pm Funktion ist ja schon ein ganz schöner Hammer
Ja Ich weiß...
es geht bestimmt eleganter... :roll:
Nur weiß ich noch nicht wie...
Im Prinzip soll das Datum für den Datensatz ab der letzten Flanke vorausgesagt werden, wann der Level 10 erreicht wird. Wenn es noch keine gibt dann eben aus dem aktuellen Datensatz, darauf wird geachtet, dass eben die Flanke groß genug ist also ab Level 60, und genügend Abmessungen vorhanden sind.

Ich arbeite mit RStudio da ist es ganz einfach ("per Mausklick"):

Code: Alles auswählen

library(readxl)
 Example_Set <- read_excel("Example_Set.xlsx")
View(Example_Set)
Besten Dank
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von jogo »

Regression hat geschrieben: Fr Mär 02, 2018 3:38 pm Ich arbeite mit RStudio da ist es ganz einfach ("per Mausklick"):

Code: Alles auswählen

library(readxl)
 Example_Set <- read_excel("Example_Set.xlsx")
View(Example_Set)
Das liegt nicht an RStudio, sondern an dem verwendeten Paket readxl

Ich bin bis jetzt soweit:

Code: Alles auswählen

library("readxl")
Example_Set <- read_excel("Example_Set.xlsx")

library("data.table")
setDT(Example_Set)
# ...
satz<-Example_Set[V1=="00353874-129C-4FFB-AC0E-B24F7E245118"]
date_forecast(satz)
# > date_forecast(satz)
# (Intercept) 
# "4208772-10-23" 
Kannst Du dies bestätigen?

Nachtrag:
ich schaue mir schon mal Deine Funktion an. Mir fällt auf, dass Du auf dem übergebenem Datatable-Objekt arbeitest ...
Ich vermute, Du musst es vor solchen Aktionen kopieren, weil bei Datatable-Objekten viel per reference gearbeitet wird.
Was mich besonders verwirrt:
1. Scheinbar nimmst Du einige Spalten aus der Tabelle raus, manipulierst diese und verwendest das Ergebnis, um die übergebene Tabelle zu indizieren.
2. Du verwendest data.table-Objekte, aber viele Zugriffe sind eher wie bei Dataframes.

Gruß, Jörg
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von Regression »

hmm... hab eigentlich nur variablen Namen geändert, aber es kommt was anderes raus :?

Muss wohl Montag nach dem Fehler weiter suchen...
Können wir unser Diskus am Montag fortsetzten?

Und Besten Dank schon mal für die investierte Zeit!
Großes Lob!
Regression
Beiträge: 76
Registriert: Mo Jan 15, 2018 9:57 am

Re: Data.table mit unterschiedlichen Ergebnissen

Beitrag von Regression »

jogo hat geschrieben: Fr Mär 02, 2018 3:55 pm
Nachtrag:
ich schaue mir schon mal Deine Funktion an. Mir fällt auf, dass Du auf dem übergebenem Datatable-Objekt arbeitest ...
Ich vermute, Du musst es vor solchen Aktionen kopieren, weil bei Datatable-Objekten viel per reference gearbeitet wird.
Hört sich nach einem Ansatzpunk an... Danke schon mal!
Antworten