Zelleneintrag abhängig von vor-und nachfolgender Zelle

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

Moderatoren: EDi, jogo

Antworten
dino300
Beiträge: 2
Registriert: Mi Mär 25, 2020 7:00 pm

Zelleneintrag abhängig von vor-und nachfolgender Zelle

Beitrag von dino300 »

Hallo Zusammen!

Ich bin hier und im RStudio neu und hoffentlich richtig...
Seit längerem beschäftige ich mich mit dem nachstehenden Problem und habe deshalb beschlossen, hier Hilfe zu Suchen!
Aus Datenschutzgründen habe ich das Bsp etwas umgeformt, ich hoffe verständlich....

In dem Bsp gibt es die Spalten "Merkmal", "Folge" und "Identifikation".

Code: Alles auswählen

#Code:
Merkmal <- c(11,21,"-","-",13,"-",32,12,"-",22)
Folge   <- c(1,2,3,4,1,2,3,1,2,3)
#Alphatier (ID mit 11,12,13), Katze (ID mit 21,22) Maus (ID mit 32)
Identifikation <- c("Alphatier","Katze","","","Alphatier","","Maus","Alphatier","","Katze")
Tabelle <- cbind(Merkmal,Folge,Identifikation)
Die Werte in "Merkmal" haben jeweils eine fixe Zuteilung zu einer der drei "Identifikationen" (Alphatier, Katze oder Maus) - dies habe ich bereits mit ifelse erledigt (hier nur manuell)! Die Spalte "Identifikation" ist jedoch aufgrund der mangelnden Information in der Spalte "Merkmal" lückenhaft.

Es gilt jedoch: das Alphatier kann eine Gruppe mit NUR Katzen oder NUR Mäuse anführen, d.h. aus der Spalte "Folge" kann manuell auf das zugehörige Tier geschlossen werden - wir haben hier:
- Zeile 1:4 ist eine Katzengruppe mit 4 Mitgliedern
- Zeile 5:7 ist eine Mausgruppe mit 3 Mitgliedern
- Zeile 8:10 ist eine Katzengruppe mit 3 Mitgliedern.

Code: Alles auswählen

#Lösung: so sollte es aussehen
Loesung <- c("Alphatier","Katze","Katze","Katze","Alphatier","Maus","Maus","Alphatier","Katze","Katze")
Tabelle_Loesung <- cbind(Merkmal,Folge,Identifikation, Loesung)

Für meine weitere Bearbeitung benötige ich in der Spalte "Identifikation" die Lücken mit dem richtigen Tier gefüllt.
In der Theorie wäre ich es so angegangen:
1.prüfen ob Laufvariable i in Spalte "Identifikation" == 0, wenn ja
→1.1 ist i-1 == "katze", dann befülle i == "Katze"
→1.2 ist i-1 == "Maus", dann befülle i == "Maus"
→1.3 ist i+1 == "katze", dann befülle i == "Katze"
→1.4 ist i+1 == "Maus", dann befülle i == "Maus"
2.sonst Zeile leer lassen

... wie kann ich das (mit einer for Schleife???) für eine große Datenbank umsetzen? Ich wäre sehr sehr dankbar über Inputs und Infos!!!!

LG
Dateianhänge
R_Lösung.JPG
R_Lösung.JPG (24.41 KiB) 600 mal betrachtet
Zuletzt geändert von dino300 am Do Mär 26, 2020 9:24 am, insgesamt 1-mal geändert.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zelleneintrag abhängig von vor-und nachfolgender Zelle

Beitrag von bigben »

dino300 hat geschrieben: Mi Mär 25, 2020 7:29 pm#Code:
Merkmal <- c(11,21,"-","-",13,"-",32,12,"-",22)
Folge <- c(1,2,3,4,1,2,3,1,2,3)
#Alphatier (ID mit 11,12,13), Katze (ID mit 21,22) Maus (ID mit 32)
Identifikation <- c("Alphatier","Katze","","","Alphatier","","Maus","Alphatier","","Katze")
Tabelle <- cbind(Merkmal,Folge,Identifikation)

[...]

1.prüfen ob Laufvariable i in Spalte "Identifikation" == 0, wenn ja
In der Spalte Identifikation stehen Tierarten, keine Zahlen. Deshalb wird da auch nie Null stehen. Die Idee, sich einen solchen Algorithmus auszudenken, ihn erstmal auf Deutsch zu formulieren und dann eine Schleife damit zu beschäftigen ist gut. Dann muss aber klar sein, was mit einer Laufvariable gemeint ist, ob i für die Laufvariable der for-Schleife stehen soll oder für Werte aus einer Spalte und welche Werte die Spalten einnehmen können. Wenn der Algorithmus richtig und verständlich ist, dann wird er sich auch in eine Schleife in R umschreiben lassen.

Bitte lies das hier: viewtopic.php?f=20&t=29

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
dino300
Beiträge: 2
Registriert: Mi Mär 25, 2020 7:00 pm

Re: Zelleneintrag abhängig von vor-und nachfolgender Zelle

Beitrag von dino300 »

Danke für den Hinweis bzgl der Codedarstellung Bernhard!

Ich hätte mir gedacht, dass ich eine Laufvariable der for Schleife benötige und somit jede Zelle des Vektors "Identifikation" durchgehen kann.
So in etwa:

Code: Alles auswählen

for (i in Identifikation) {
  ifelse(i-1=="Katze","Katze",
         ifelse(i-1=="Maus","Maus",
                ifelse(i+1=="Katze","Katze",
                       ifelse(i+1=="Maus","Maus",
                              ""))))
}
mit i+1 und i-1 hätte ich die vor-&nachstehende Zelle geprüft! Nur, dass dieser Code natürlich nicht funktioniert..

Meine Fragen/Unklarheiten konkret:
1. Wie kann ich das Durchlaufen der Spalte "Identifikation" mit der For-Schleife (oder auch anders) machen und
2. Wie kann ich einen Zelleneintrag abhaängig von der vorherigen bzw nachfolgenden Zelle durchführen?

Danke für eure mühen, ich weiß, dass es mit einer Anfängerin wie mir nicht leicht ist.... :?
ruedi_br
Beiträge: 159
Registriert: Do Mär 01, 2018 3:53 pm

Re: Zelleneintrag abhängig von vor-und nachfolgender Zelle

Beitrag von ruedi_br »

Für mich sind schon die nicht eindeutigen Zeilen mit Merkmal="-" und Folge=2 ein Problem. Woher soll ein Algorithmus wissen, dass im einen Fall die Lösung Maus, im anderen Katze lautet?
Dann braucht es als Merkmal ggf. noch eine Zeilennummer - in der Hoffnung, dass der Datensatz durchgehend nach der gezeigten Logik aufgebaut ist.
Grüße
Ruedi
fortune(111)
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zelleneintrag abhängig von vor-und nachfolgender Zelle

Beitrag von bigben »

dino300 hat geschrieben: Do Mär 26, 2020 9:58 amMeine Fragen/Unklarheiten konkret:
1. Wie kann ich das Durchlaufen der Spalte "Identifikation" mit der For-Schleife (oder auch anders) machen

Hilft das hier?

Code: Alles auswählen

Tabelle <- data.frame(Merkmal = c(11,21,"-","-",13,"-",32,12,"-",22),
                      Folge = c(1,2,3,4,1,2,3,1,2,3),
                      Identifikation = c("Alphatier","Katze","","","Alphatier","","Maus","Alphatier","","Katze"),
                      stringsAsFactors = FALSE)

for(i in 2:(nrow(Tabelle)-1)){
  cat("\n*\nUntersuche jetzt Zeile "); cat(i)
  cat("\nin der Zeile davor ist Folge == "); cat(Tabelle[i-1, "Folge"])
  cat("\nin dieser Zeile ist Identifikation == "); cat(Tabelle[i, "Identifikation"])
  cat("\nin der Zeile danach ist Merkmal == "); cat(Tabelle[i+1, "Merkmal"])
}
Die Schleife läuft von der zweiten bis zur vorletzten Zeile durch, weil es nur für diese eine Vorgänger- und Nachfolgezeile gibt. i ist jeweils die Zeilennummer, so wie die eckigen Klammern als Zugriffsmethode auf einzelne "Zellen" sie verwenden.

HTH,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
transporter
Beiträge: 5
Registriert: Mo Apr 13, 2020 2:42 pm

Re: Zelleneintrag abhängig von vor-und nachfolgender Zelle

Beitrag von transporter »

Liebe Community,
ich bin ebenfalls neu hier und habe eine ähnliche Frage wie kosa. Es geht auch darum eine Zelle abhängig der vorangegangenen und der nachfolgenden Zelle zu befüllen.

Code: Alles auswählen

Tabelle <- data.frame(p_id = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3),
                      w_id = c(1, 2, 3, 1, 2, 1, 2, 3, 1, 2),
                      a    = c("A", "E", "W", "A", "W", "A", "E", "W", "F", "W"))
Tabelle$a_kette <- "KETTE"
Ziel ist es, die Spalte "a_kette" folgendermaßen zu befüllen

Code: Alles auswählen

Tabelle$a_kette <- c("AEW", "AEW", "AEW", "AW", "AW", "AEW", "AEW", "AEW", "FW", "FW")
Eine Kette beginnt immer wenn w_id=1, d.h. für eine p_id können mehrere unterschiedliche Ketten vorliegen.
Aktuell exportiere ich die Daten in EXCEL und nutze eine WENN Funktion. Der erste Eintrag einer Kette, der gebildet wird, ist maßgebend für alle folgenden Einträge einer Kette. Diese kopieren so lange die letzte Kette (;E1), bis w_id=1.
=WENN(C2=1; WENN(C2+1=C3;WENN(C2+2=C4;D2&D3&D4;D2&D3);D2);E1)
Im Original nimmt diese WENN Funktion eine astronomische Größe an - das ist natürlich kein Zustand, deshalb meine Fragen:
1. Letztlich ist der if-else Befehl der WENN Funktion sehr ähnlich, allerdings sind mir keine Möglichkeiten bekannt den Bezug auf vorangegangene oder nachfolgende Zellen herzustellen. Gibt es da eine Möglichkeit?
2. Falls 1 nicht möglich ist: Wie kann ich die Schleife von kosa für meine Zwecke umbauen?

Und: Soll ich lieber ein neues Thema erstellen?

LG
transporter
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zelleneintrag abhängig von vor-und nachfolgender Zelle

Beitrag von bigben »

Hallo transporter,

ich persönlich würde Dich ermutigen. einen eigenen Thread aufzumachen. Persönlich würde ich mir darin eine bessere Beschreibung der Regeln wünschen, nach denen a_kette erstellt werden soll. Ich -nur als Beispiel- habe es noch nicht kapiert.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: Zelleneintrag abhängig von vor-und nachfolgender Zelle

Beitrag von jogo »

Hallo transporter,

willkommen im Forum!

Code: Alles auswählen

Tabelle <- data.frame(p_id = c(1, 1, 1, 2, 2, 3, 3, 3, 3, 3),
                      w_id = c(1, 2, 3, 1, 2, 1, 2, 3, 1, 2),
                      a    = c("A", "E", "W", "A", "W", "A", "E", "W", "F", "W"))
Tabelle$K <- cumsum(Tabelle$w_id==1)
K0 <- tapply(Tabelle$a, Tabelle$K, FUN=paste0, collapse='')
Tabelle$Kette <- K0[Tabelle$K]
Tabelle
Gruß, Jörg
Antworten