Fehler: dimnames(x) <- dn

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

Moderatoren: EDi, jogo

Antworten
Christian01
Beiträge: 3
Registriert: Mi Mai 20, 2020 3:54 pm

Fehler: dimnames(x) <- dn

Beitrag von Christian01 »

Hallo liebe R-Experten,

ich komme direkt auf den Punkt: Das Ausführen meines Programmes funktioniert, aber wenn ich ein print(<data.table>) ausführe, bekomme ich folgenden Fehler:
Fehler in dimnames(x) <- dn :
Länge von 'dimnames' [1] ungleich der Arrayausdehnung
Zusätzlich: Warnmeldung:
In cbind(Timestamp = c("2020-04-27 07:16:37", "2020-04-27 07:17:27", :
number of rows of result is not a multiple of vector length (arg 1)
Natürlich habe ich schon Google verwendet, aber nicht auf eine plausible Erklärung gekommen.

Ich hoffe ihr könnt mir weiterhelfen und mir eine kurze Erklärung geben, warum der Fehler auftaucht, da ich Neuling in R bin.
Vielen Dank schon mal im Voraus.

Gruß und schönes Wochenende

Christian

Anhang

Code: Alles auswählen

library(data.table)
library(lubridate)

# Stoerdaten aufbereiten
# -- generalDataFormating -- soll den Dateinamen uebergeben bekommen, 
# in der die Daten der Stoerungen stehen. Anschlie?end soll die Datei gelesen werden und formatiert werden
# -- Call by -- dataname muss ein string sein und die Dateiendung beinhalten
# -- return -- data.table mit den aufbereiteten Daten
gerneralDataFormating <- function(dataname){
  
  # Datei einlesen.
  # Vorsicht: das richtige working-directory muss ausgewaehlt sein.
  dt <- fread(dataname, stringsAsFactors = F)
  
  # Daten aufbereiten
  dt[, Zustand := NULL]
  #dt[, Störort := NULL]
  setnames(dt, c("Datum und Uhrzeit"), c("Timestamp"))
  
  dt <- dt[,c("Timestamp", 
               "Maschine", 
               "Meldungsart",
               "Station",
               "Fehlertext", 
               "Dauer [s]",
               "Meldenummer",
               "KW",
               "Tag",
               "Monat",
               "Jahr")]
  
  #setnames(dt, c("Datum und Uhrzeit"), c("Timestamp"))
  setnames(dt, c("Dauer [s]"), c("Dauer"))
  dt[, Maschine := as.factor(Maschine)]
  dt[, Meldungsart := as.factor(Meldungsart)]
  dt[, Station := as.factor(Station)]
  dt[, Fehlertext := as.factor(Fehlertext)]
  dt[,Timestamp := dmy_hms(Timestamp)]
  dt[,  `:=` (Uhrzeit = hours(hour(Timestamp)) + minutes(minute(Timestamp)) + seconds(second(Timestamp)))]
 
  setnames(dt, c("Meldungsart"), c("Stationsnummer"))
  setnames(dt, c("Station"), c( "Meldungsart"))
  #setnames(dt, c("Datum und Uhrzeit"), c("Timestamp"))
  return(dt)
}

# Stoerdaten verarbeiten
# -- interruptAnalyse -- soll aufbereitete Stoerdaten uebergeben bekommen. Danach sollen die Stoerdaten auf Haeufigkeit
# und Dauer der Stoerungen in Bezug auf den Stoerort anlysiert werden.
# -- Achtung --
# -- Call by --  Als Parameter sollen hier Datum und optional die Zeit f?r den Start des Zeitraums ?bergeben werden.
# Gleiches gilt fuer den Endzeitpunkt
# Zusaetzlich muss eine data.table mit Stoerdaten uebergeben werden.
# -- return -- sollen data.tables  sein. Die erste soll die Stoerungen nach ihrer Anzahl auflisten,
# die zweite nach der Dauer. Jeweils soll ein absteigendes Ranking verwendet werden.

interruptAnalyse <- function (dt, time.start, time.end){
  # "Timestamp","Maschine","Stationsnummer","Meldungsart","Fehlertext","Dauer","Meldenummer", "KW", "Tag", "Monat", "Jahr
  #dt[, Meldungsart := NULL]
 
  dt[, KW := NULL]
  dt[, Tag := NULL]
  dt[, Monat := NULL]
  dt[, Jahr := NULL]
  # "Timestamp,"Maschine","Stationsnummer","Meldungsart","Fehlertext","Dauer"
  dt[Timestamp>time.start & Timestamp < time.end, ]
  
  # In die Dauer der Stoerungen darf die Pausenzeit nicht mit einbezogen werden
  ### Ist die Stunde:Minute:Sekunde +Dauer der Stoerung [s] 
  ### > Stunde:Minute:Sekunde der Pause ? 
  
  
  # Haeufigkeit der Stoerungen in Bezug auf Stationsnummer, Meldungsart, und Fehlertext
  res <- dt[, .(Haeufigkeit = .N, DauerGesamt = sum(Dauer)), 
                   keyby = c("Stationsnummer", "Meldungsart", "Fehlertext")]
  
  return(res)
}

### Zeitraum festlegen
# Start: 27.04.2020 00:00:00 Uhr
# Ende: 01.05.2020 00:00:00 Uhr
pausen <- data.table(Fruehschicht = c(period_to_seconds((hours(8) + minutes(45))), period_to_seconds((hours(11) + minutes(45)))),
                     Spaetschicht = c(period_to_seconds(hours(15) + minutes(45)), period_to_seconds((hours(19) + minutes(45)))),
                     Nachtschicht = c(period_to_seconds(hours(0) + minutes(45)), period_to_seconds(hours(3) + minutes(45)))
                     )
date.start <- dmy_hms("27.04.2020 00:00:00")
date.end <- dmy_hms("28.04.2020 00:00:00")


dt7116.18 <- gerneralDataFormating("xy.csv")
res <- interruptAnalyse(dt7116.18, date.start, date.end)

print(dt7116.18)
Wende ich

Code: Alles auswählen

sapply(dt,class)
nachdem Einlesen der Datei an kommt folgndes Ergebnis:

Code: Alles auswählen

Datum und Uhrzeit           Störort          Maschine       Meldungsart           Station        Fehlertext 
      "character"         "integer"       "character"       "character"       "character"       "character" 
        Dauer [s]           Zustand       Meldenummer                KW               Tag             Monat 
        "integer"       "character"         "integer"         "integer"         "integer"         "integer" 
             Jahr               V14               V15               V16               V17               V18 
        "integer"         "logical"         "logical"         "logical"         "logical"         "logical" 
              V19               V20               V21               V22               V23               V24 
        "logical"         "logical"         "logical"         "logical"         "logical"         "logical" 
              V25               V26               V27               V28               V29               V30 
        "logical"         "logical"         "logical"         "logical"         "logical"         "logical" 
              V31               V32               V33               V34               V35               V36 
        "logical"         "logical"         "logical"         "logical"         "logical"         "logical" 
              V37               V38               V39               V40               V41               V42 
        "logical"         "logical"         "logical"         "logical"         "logical"         "logical" 
              V43               V44               V45               V46               V47               V48 
        "logical"         "logical"         "logical"         "logical"         "logical"         "logical" 
              V49               V50               V51               V52               V53               V54 
        "logical"         "logical"         "logical"         "logical"         "logical"         "logical" 
              V55               V56               V57               V58               V59               V60 
        "logical"         "logical"         "logical"         "logical"         "logical"         "logical" 
              V61               V62               V63               V64               V65               V66 
        "logical"         "logical"         "logical"         "logical"         "logical"         "logical" 
              V67               V68               V69               V70 
        "logical"         "logical"         "logical"         "logical" 
> 
jogo
Beiträge: 2093
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehler: dimnames(x) <- dn

Beitrag von jogo »

Hallo Christian,

willkommen im Forum!
Da wir nicht die entsprechenden Daten haben, können wir den Fehler auch nicht reproduzieren.

Dafür, dass Du ein Neuling in R bist, hast Du schon eine beachtliche Funktion geschrieben. :o
Sicher kennst Du dann auch die Funktion debug().

Gruß, Jörg
Christian01
Beiträge: 3
Registriert: Mi Mai 20, 2020 3:54 pm

Re: Fehler: dimnames(x) <- dn

Beitrag von Christian01 »

Grüß dich Jörg,

danke für dein Feedback und deine Rückmeldung. Bezüglich der Funktion: Ich frage mich noch, ob man das mit den Datum und Uhrzeit einfacher geht.

Bezüglich der Daten: Hier habe ich einmal "Dummydaten" erzeugt --> siehe Anhang.
Debug() werde ich direkt mal ausprobieren. Kenne nur den Debug-Mode von RStudio, mit dem ich gerade nur so semi-gut klar kommen. Aber was nicht ist kann ja noch werden :)

Gruß Christian
Dateianhänge
Dummydaten.csv
(502 Bytes) 89-mal heruntergeladen
jogo
Beiträge: 2093
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehler: dimnames(x) <- dn

Beitrag von jogo »

Hallo Christian,

die Funktion Debug() kenne ich nicht - die habe ich Dir auch nicht empfohlen.

Nachtrag:
Ich habe die von Dir gelieferten Daten in Deinem Code verwendet.
Bei mir läuft alles ohne Murren durch. Somit kann ich auch mit den Daten den Fehler nicht reproduzieren.

Gruß, Jörg
bigben
Beiträge: 2894
Registriert: Mi Okt 12, 2016 9:09 am

Re: Fehler: dimnames(x) <- dn

Beitrag von bigben »

Großschreibung am Satzanfang ist korrekte Syntax.
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Christian01
Beiträge: 3
Registriert: Mi Mai 20, 2020 3:54 pm

Re: Fehler: dimnames(x) <- dn

Beitrag von Christian01 »

So, ich habe die Ursache gefunden aber noch keine Erklärung:(

Ich habe die Spalte Uhrzeit vom Typ

Code: Alles auswählen

$Uhrzeit
[1] "Period"
attr(,"package")
[1] "lubridate"
gelöscht.

Danach habe ich wieder

Code: Alles auswählen

print(dt7116.18)
ausgeführt und es funktioniert.

Jetzt steh ich vor der Quizfrage, warum geht es ohne die Spalte? Was macht die Spalte so besonders, dass es mit ihr nicht funktioniert?
Kann es an dem Datentypen liegen?

Gruß Christian
jogo
Beiträge: 2093
Registriert: Fr Okt 07, 2016 8:25 am

Re: Fehler: dimnames(x) <- dn

Beitrag von jogo »

Hallo Christian,

bei mir sieht die Struktur so aus:

Code: Alles auswählen

> str(dt7116.18)
Classes ‘data.table’ and 'data.frame':	5 obs. of  8 variables:
 $ Timestamp     : POSIXct, format: "2020-04-27 20:07:16" "2020-04-27 20:07:17" "2020-04-27 20:07:18" ...
 $ Maschine      : Factor w/ 2 levels "Links","Rechts": 2 2 2 1 1
 $ Stationsnummer: Factor w/ 4 levels "text <243>","text 06545",..: 4 4 3 2 1
 $ Meldungsart   : Factor w/ 4 levels "Allgemein","Kontrolle",..: 1 1 2 3 4
 $ Fehlertext    : Factor w/ 5 levels "Drehen","Lampe kaputt",..: 3 5 2 1 4
 $ Dauer         : int  2549 3 33 74 3
 $ Meldenummer   : int  2 2 2 3 3
 $ Uhrzeit       :Formal class 'Period' [package "lubridate"] with 6 slots
  .. ..@ .Data : num  16 17 18 18 19
  .. ..@ year  : num  0 0 0 0 0
  .. ..@ month : num  0 0 0 0 0
  .. ..@ day   : num  0 0 0 0 0
  .. ..@ hour  : num  20 20 20 20 20
  .. ..@ minute: num  7 7 7 7 7
 - attr(*, ".internal.selfref")=<externalptr> 
$Uhrzeit ist also ein S4-Objekt. Ob das die Ursache für Dein Problem ist, weiß ich nicht.

Gruß, Jörg
Antworten