Code in R - Schleife funktioniert nicht

Dragora

Newbie
Registriert
Aug. 2024
Beiträge
2
Hallo, ich habe folgendes Problem. Ich habe eine Datei, die ich History nenne, erstellt. Auf Blatt 1 sind 20 Spalten mit 20 Namen betitelt. Jede Zeile besteht aus 20 Zahlen, sprich jede Zeile hat 20 mal 20 Zahlen. Das ist soweit auch alles korrekt. Insgesamt sind es über 1000 Zeilen, die diese Anzahl an Zahlen besitzen. Mein Ziel ist es jedoch, dass auf Blatt 2 die Wiederholungen angezeigt werden, die an diversen Tagen vorkommen. Also, wenn in Zeile 2, 5, 8, 32, 66 in diversen Spalten Wiederholungen vorkommen, dann möchte ich, dass diese auf Blatt 2 unter einem Muster gespeichert werden. Sprich auf Blatt 2 sind ebenfalls die Spaltennamen von Blatt + Spaltenname für die Häufigkeit der Wiederholungen und eine Spalte für die Zuordnung der Zeilen. Das Problem ist, dass egal was ich probiere, die Schleife nicht richtig arbeitet. Entweder spinnt diese total und macht völlig falsche Ergebnisse, mal findet sie auch keine oder wie in meinem jetzigen Fall: Sie vergleicht Zeile 2 bis 6, Zeile 3 bis 7, Zeile 4 bis 8, aber Zeile 2 mit dem kompletten Datensatz ist nicht drin, genau so wie mit den anderen.

Ich zeige euch mal den Code bzw Ausschnitte davon:

calculate_plus_and_patterns_improved <- function(historical_data, min_repeats = 5) {

# Erstelle ein leeres DataFrame für die Ergebnisse mit korrekten Überschriften

results <- data.frame(matrix(ncol = 23, nrow = 0))

colnames(results) <- c(paste0("plus", 1:20), "Häufigkeit", "Tage", "Kombination")



# Extrahiere Plus-Werte aus den historischen Daten

all_plus_combinations <- list()



for (tag in 1:nrow(historical_data)) {

plus_values <- list()

for (i in 1:20) {

plus_column <- paste0("plus", i)

plus_values[] <- tryCatch({

as.numeric(unlist(strsplit(as.character(historical_data[[plus_column]][tag]), ",")))

}, error = function(e) {

warning("Fehler bei der Konvertierung von plus_values an Tag ", tag, ": ", conditionMessage(e))

return(NA)

})

}

all_plus_combinations[[tag]] <- plus_values

}



# Debugging: Anzahl der gespeicherten Plus-Kombinationen anzeigen

cat("Anzahl der gespeicherten Plus-Kombinationen: ", length(all_plus_combinations), "\n")



# Verfolge Muster und deren Tage

pattern_dict <- list()



# Iteriere über alle möglichen Starttage

for (start_day in 1:(length(all_plus_combinations) - min_repeats + 1)) {

cat("Verarbeite Starttag: ", start_day, "\n") # Debugging-Ausgabe



# Iteriere über alle möglichen Mustermengen ab min_repeats und begrenze das Ende der Schleife

for (pattern_length in min_repeats:(length(all_plus_combinations) - start_day + 1)) {

pattern_found <- list()



# Vergleiche die Plus-Werte für den Bereich der Tage

for (i in 1:20) {

common_values <- NULL

for (day in start_day:(start_day + pattern_length - 1)) {

# Sicherheitsabfrage, um sicherzustellen, dass der Index innerhalb der Grenzen liegt

if (day <= length(all_plus_combinations)) {

if (is.null(common_values)) {

common_values <- all_plus_combinations[[day]][]

} else {

common_values <- intersect(common_values, all_plus_combinations[[day]][])

}

} else {

warning("Tag ", day, " liegt außerhalb der Grenzen von all_plus_combinations")

}

}



# Überprüfe, ob common_values existiert und nicht leer ist

if (!is.null(common_values) && length(common_values) > 0 && !all(is.na(common_values))) {

pattern_found[[length(pattern_found) + 1]] <- list(zahl_spalte = i, values = common_values)

}

}



# Speichere das Muster, wenn es genügend Wiederholungen gibt

if (length(pattern_found) > 0) {

pattern_key <- paste(sapply(pattern_found, function(x) paste(x$zahl_spalte, collapse = ",")), collapse = ";")



if (is.null(pattern_dict[[pattern_key]])) {

pattern_dict[[pattern_key]] <- list(days = start_day:(start_day + pattern_length - 1), pattern_found = pattern_found)

cat("Muster gefunden zwischen Tag ", start_day, " und Tag ", start_day + pattern_length - 1, "\n") # Debugging-Ausgabe

} else {

pattern_dict[[pattern_key]]$days <- unique(c(pattern_dict[[pattern_key]]$days, start_day:(start_day + pattern_length - 1)))

}

}

}

}



# Filtere Muster, die die Mindestanzahl von Wiederholungen erreichen

for (pattern in pattern_dict) {

if (length(pattern$days) >= min_repeats) {

combination <- rep(NA, 20)

for (p in pattern$pattern_found) {

combination[p$zahl_spalte] <- paste("Plus", paste(p$values, collapse = ","))

}



new_row <- c(combination, length(pattern$days), paste(pattern$days, collapse = ","), paste("Muster", nrow(results) + 1))

results <- rbind(results, new_row)

}

}



# Debugging: Anzahl der gefundenen Muster anzeigen

cat("Anzahl der gefundenen Muster: ", nrow(results), "\n")



return(results)

}



# Lade die Excel-Datei mit historischen Daten

historical_data <- read.xlsx("...", sheet = 1)



# Berechnung der Plus-Werte und Identifizierung von Mustern

frequent_patterns_improved_df <- calculate_plus_and_patterns_improved(historical_data, min_repeats = 5)



# Ausgabe der ersten Zeilen zur Überprüfung

print(head(frequent_patterns_improved_df))



# Überprüfe die Anzahl der Zeilen vor dem Speichern

cat("Zeilen im DataFrame nach der Berechnung: ", nrow(frequent_patterns_improved_df), "\n")



# Ergebnisse in einer Excel-Datei speichern

if (nrow(frequent_patterns_improved_df) > 0) {

write.xlsx(list(Blatt1_Historische_Daten = historical_data, Blatt2_Plusrechnungen = frequent_patterns_improved_df),

"...")

cat("Datei wurde erfolgreich gespeichert.\n")

} else {

cat("Es wurden keine Muster gefunden, Datei wurde nicht gespeichert.\n")

}

Ich dreh noch durch. Selbst die Google KI gab mir nur falsche Änderungen.

Ergänzung ()

Das da jetzt Smileys zu sehen sind war keine Absicht ^^
 
Setzt das mal in die passenden Code Tags, kann ja keiner lesen.

Auch ist mir das viel zu viel. Was genau ist dein Problem? Das kannst du ja auf 1-2 Zeilen reduzieren
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: BeBur, tollertyp und Micke
Würde ich auf zwei Zeilen reduzieren wollen, hätte ich es mit Sicherheit gesagt, oder? Nein, stattdessen habe ich den kompletten Datensatz erwähnt.
Ergänzung ()

Problem beseitigt! Dankeschön an den netten Herrn, der mir geholfen hat :-)
 
Zuletzt bearbeitet:
Wenn du jetzt noch erklärst, woran es lag, hilft es vielleicht auch zukünftig jemandem, der darüber stolpert.

Das allerschlimmste an alten Hilfethreads im Internet ist es, wenn der Ersteller sie einfach mit "hab's gelöst" verlässt.
Ergänzung ()

Dragora schrieb:
Das da jetzt Smileys zu sehen sind war keine Absicht ^^
Pack einfach Code Tags um den Quelltext. Das ist das kleine </> Symbol im Texteditor hier.
 
  • Gefällt mir
Reaktionen: nutrix, tollertyp, Drahminedum und 10 andere
So hätte das aussehen können:
Code:
calculate_plus_and_patterns_improved <- function(historical_data, min_repeats = 5) {
 
  # Erstelle ein leeres DataFrame für die Ergebnisse mit korrekten Überschriften
  results <- data.frame(matrix(ncol = 23, nrow = 0))
  colnames(results) <- c(paste0("plus", 1:20), "Häufigkeit", "Tage", "Kombination")
 
  # Extrahiere Plus-Werte aus den historischen Daten
  all_plus_combinations <- list()
 
  for (tag in 1:nrow(historical_data)) {
    plus_values <- list()
   
    for (i in 1:20) {
      plus_column <- paste0("plus", i)
      plus_values[] <- tryCatch({
        as.numeric(unlist(strsplit(as.character(historical_data[[plus_column]][tag]), ",")))
      }, error = function(e) {
        warning("Fehler bei der Konvertierung von plus_values an Tag ", tag, ": ", conditionMessage(e))
        return(NA)
      })
    }
   
    all_plus_combinations[[tag]] <- plus_values
  }
 
  # Debugging: Anzahl der gespeicherten Plus-Kombinationen anzeigen
  cat("Anzahl der gespeicherten Plus-Kombinationen: ", length(all_plus_combinations), "\n")
 
  # Verfolge Muster und deren Tage
  pattern_dict <- list()
 
  # Iteriere über alle möglichen Starttage
  for (start_day in 1:(length(all_plus_combinations) - min_repeats + 1)) {
    cat("Verarbeite Starttag: ", start_day, "\n") # Debugging-Ausgabe
   
    # Iteriere über alle möglichen Mustermengen ab min_repeats und begrenze das Ende der Schleife
    for (pattern_length in min_repeats:(length(all_plus_combinations) - start_day + 1)) {
      pattern_found <- list()
     
      # Vergleiche die Plus-Werte für den Bereich der Tage
      for (i in 1:20) {
        common_values <- NULL
       
        for (day in start_day:(start_day + pattern_length - 1)) {
          # Sicherheitsabfrage, um sicherzustellen, dass der Index innerhalb der Grenzen liegt
          if (day <= length(all_plus_combinations)) {
            if (is.null(common_values)) {
              common_values <- all_plus_combinations[[day]][]
            } else {
              common_values <- intersect(common_values, all_plus_combinations[[day]][])
            }
          } else {
            warning("Tag ", day, " liegt außerhalb der Grenzen von all_plus_combinations")
          }
        }
       
        # Überprüfe, ob common_values existiert und nicht leer ist
        if (!is.null(common_values) && length(common_values) > 0 && !all(is.na(common_values))) {
          pattern_found[[length(pattern_found) + 1]] <- list(zahl_spalte = i, values = common_values)
        }
      }
     
      # Speichere das Muster, wenn es genügend Wiederholungen gibt
      if (length(pattern_found) > 0) {
        pattern_key <- paste(sapply(pattern_found, function(x) paste(x$zahl_spalte, collapse = ",")), collapse = ";")
       
        if (is.null(pattern_dict[[pattern_key]])) {
          pattern_dict[[pattern_key]] <- list(days = start_day:(start_day + pattern_length - 1), pattern_found = pattern_found)
          cat("Muster gefunden zwischen Tag ", start_day, " und Tag ", start_day + pattern_length - 1, "\n") # Debugging-Ausgabe
        } else {
          pattern_dict[[pattern_key]]$days <- unique(c(pattern_dict[[pattern_key]]$days, start_day:(start_day + pattern_length - 1)))
        }
      }
    }
  }
 
  # Filtere Muster, die die Mindestanzahl von Wiederholungen erreichen
  for (pattern in pattern_dict) {
    if (length(pattern$days) >= min_repeats) {
      combination <- rep(NA, 20)
     
      for (p in pattern$pattern_found) {
        combination[p$zahl_spalte] <- paste("Plus", paste(p$values, collapse = ","))
      }
     
      new_row <- c(combination, length(pattern$days), paste(pattern$days, collapse = ","), paste("Muster", nrow(results) + 1))
      results <- rbind(results, new_row)
    }
  }
 
  # Debugging: Anzahl der gefundenen Muster anzeigen
  cat("Anzahl der gefundenen Muster: ", nrow(results), "\n")
 
  return(results)
}

# Lade die Excel-Datei mit historischen Daten
historical_data <- read.xlsx("...", sheet = 1)

# Berechnung der Plus-Werte und Identifizierung von Mustern
frequent_patterns_improved_df <- calculate_plus_and_patterns_improved(historical_data, min_repeats = 5)

# Ausgabe der ersten Zeilen zur Überprüfung
print(head(frequent_patterns_improved_df))

# Überprüfe die Anzahl der Zeilen vor dem Speichern
cat("Zeilen im DataFrame nach der Berechnung: ", nrow(frequent_patterns_improved_df), "\n")

# Ergebnisse in einer Excel-Datei speichern
if (nrow(frequent_patterns_improved_df) > 0) {
  write.xlsx(list(Blatt1_Historische_Daten = historical_data, Blatt2_Plusrechnungen = frequent_patterns_improved_df), "...")
  cat("Datei wurde erfolgreich gespeichert.\n")
} else {
  cat("Es wurden keine Muster gefunden, Datei wurde nicht gespeichert.\n")
}

Dann müsste man sich auch nicht für Smilys entschuldigen :(
 
  • Gefällt mir
Reaktionen: Sebbi und nutrix
Zurück
Oben