Wert auf vorletzten Wert umcodieren

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

Moderatoren: EDi, jogo

Antworten
transporter
Beiträge: 5
Registriert: Mo Apr 13, 2020 2:42 pm

Wert auf vorletzten Wert umcodieren

Beitrag von transporter »

Liebe Community,

ich möchte den Wert „9“ auf den vorletzten Wert umcodieren. Dafür ist ein zeilenübergreifender Vergleich erforderlich.

Code: Alles auswählen

bsp <- 
  data.frame(
    ID   = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2),
    FO   = c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7),
    AK   = c(1, 4, 9, 7, 7, 9, 8, 1, 8, 4, 9, 5, 9, 8),
    AK2  = c(0))
Zeile für Zeile soll Folgendes geschehen:
Ist die ID die gleiche wie 2 Zeilen vorher & ist die Folge (FO) seitdem um 2 gestiegen & ist AK=9, dann schreibe mir in AK2 das gleiche AK wie 2 Zeilen vorher, aber wenn da ebenfalls AK=9, dann kopierst du den bereits umcodierten Wert aus der vorletzten AK2. Wenn nichts zutrifft, übernimm den Wert aus AK.

So löse ich das bisher. In Zeile 2 manuell „1“ eintragen und die EXCEL Formel in Spalte AK2 ab Zeile 3 anwenden:

Code: Alles auswählen

write.csv2(bsp, ".../bsp.csv")
=WENN(B3=B1;WENN(C3-2=C1;WENN(D3=9;WENN(D1=9;E1;D1);D3);D3);D3)

Ich denke die zusätzliche Variable "AK2" ist in R nicht erforderlich.
Könnt ihr mir helfen das in R umzusetzen? Das ist nur ein Teil einer Reihe von Operationen, die ich in EXCEL durchführe, weil ich in R nicht vorangekommen bin. Mein Ziel ist es die gesamte Aufbereitung in einem Skript zu haben.

LG
transporter

PS: Danke an bigben & jogo, dass ihr mir gestern so schnell geholfen habt! :mrgreen:
bigben
Beiträge: 2894
Registriert: Mi Okt 12, 2016 9:09 am

Re: Wert auf vorletzten Wert umcodieren

Beitrag von bigben »

Bin am Handy und kann nicht coden. Hilft das hier bzw kannst Du den Code aus diesem Post anpassen?
viewtopic.php?f=7&t=2168&p=10643#p10643

LG 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: Wert auf vorletzten Wert umcodieren

Beitrag von transporter »

Ich werde es versuchen!
LG
transporter
bigben
Beiträge: 2894
Registriert: Mi Okt 12, 2016 9:09 am

Re: Wert auf vorletzten Wert umcodieren

Beitrag von bigben »

Keine vollständige Umsetzung, aber ein brauchbarer Anfang zu weitertüfteln:

Code: Alles auswählen

bsp <- 
  data.frame(
    ID   = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2),
    FO   = c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7),
    AK   = c(1, 4, 9, 7, 7, 9, 8, 1, 8, 4, 9, 5, 9, 8),
    AK2  = NA)

l <- nrow(bsp)  # wieviele Spalten sind es

for(zeile in 3:l){  # Zeile für Zeile aber nicht zu früh anfangen
  # Ist die ID die gleiche wie 2 Zeilen vorher & ist die Folge (FO) seitdem um 2 gestiegen & ist AK=9, 
  if(bsp[zeile, "ID"] == bsp[zeile-2, "ID"] & bsp[zeile, "FO"] == bsp[zeile-2, "FO"]+2 & bsp[zeile, "AK"] == 9){
    cat("In Zeile ");cat(zeile);cat(" war die Bedingung erfüllt\n")
    # dann schreibe mir in AK2 das gleiche AK wie 2 Zeilen vorher,  
    bsp[zeile, "AK2"] <- bsp[zeile-2, "AK"]
  }
  # Wenn nichts zutrifft, übernimm den Wert aus AK.
  bsp[zeile, "AK2"] <- bsp[zeile, "AK"]
}
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
jogo
Beiträge: 2093
Registriert: Fr Okt 07, 2016 8:25 am

Re: Wert auf vorletzten Wert umcodieren

Beitrag von jogo »

Hallo Bernhard,

unten muss es heißen

Code: Alles auswählen

} else bsp[zeile, "AK2"] <- bsp[zeile, "AK"] ##Wenn nichts zutrifft, übernimm den Wert aus AK.
oder Du schreibst am Ende in den then-Teil ein next

Außerdem ist noch nicht die Bedingung verarbeitet:
wenn zwei Zeilen vorher auch eine 9 steht bei AK, dann nimm den Wert dort von AK2.
(das ist auch der Teil der Aufgabe, der die Vektorisierung verhindert)

Das könnte dann so aussehen:

Code: Alles auswählen

bsp <- 
  data.frame(
    ID   = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2),
    FO   = c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7),
    AK   = c(1, 4, 9, 7, 7, 9, 8, 1, 8, 4, 9, 5, 9, 8),
    AK2  = NA)

l <- nrow(bsp)  # wieviele Spalten sind es

for(zeile in 3:l){  # Zeile für Zeile aber nicht zu früh anfangen
  # Ist die ID die gleiche wie 2 Zeilen vorher & ist die Folge (FO) seitdem um 2 gestiegen & ist AK=9, 
  if(bsp[zeile, "ID"] == bsp[zeile-2, "ID"] & bsp[zeile, "FO"] == bsp[zeile-2, "FO"]+2 & bsp[zeile, "AK"] == 9){
    cat("In Zeile ");cat(zeile);cat(" war die Bedingung erfüllt\n")
    # dann schreibe mir in AK2 das gleiche AK wie 2 Zeilen vorher,  
    ak2 <- bsp[zeile-2, "AK"]
    bsp[zeile, "AK2"] <- if (ak2==9) bsp[zeile-2, "AK2"] else bsp[zeile-2, "AK"]
    next
  }
  # Wenn nichts zutrifft, übernimm den Wert aus AK.
  bsp[zeile, "AK2"] <- bsp[zeile, "AK"]
}
bsp
Gruß, Jörg
transporter
Beiträge: 5
Registriert: Mo Apr 13, 2020 2:42 pm

Re: Wert auf vorletzten Wert umcodieren

Beitrag von transporter »

Hallo ihr Beiden,
ich bin begeistert! Ich setze mich dran und lasse hören
LG
transporter
transporter
Beiträge: 5
Registriert: Mo Apr 13, 2020 2:42 pm

Re: Wert auf vorletzten Wert umcodieren

Beitrag von transporter »

Hallo,

in einem vorigen Schritt codiere ich alle 9er die an der Stelle 1 & 2 stehen in eine 8 um. Das war die Voraussetzung für die Umcodierung auf den vorletzten Wert. Deswegen kann ich auch auf AK verzichten und nur mit AK2 arbeiten und die Bedingung
wenn zwei Zeilen vorher auch eine 9 steht bei AK, dann nimm den Wert dort von AK2.
fällt weg.

Code: Alles auswählen

bsp <- 
  data.frame(
    ID   = c(1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2),
    FO   = c(1, 2, 3, 4, 5, 6, 7, 1, 2, 3, 4, 5, 6, 7),
    AK   = c(1, 4, 9, 7, 7, 9, 8, 1, 8, 4, 9, 5, 9, 8),
    AK2  = NA)
bsp$AK2 <- bsp$AK
bsp$AK2 <- ifelse(bsp$AK2 == 9 & 
                  bsp$FO  == 1 |
                  bsp$AK2 == 9 & 
                  bsp$FO  == 2 ,
                  8, bsp$AK2)
l <- nrow(bsp)
for(zeile in 3:l){
  if(bsp[zeile, "ID"]  == bsp[zeile-2, "ID"]   & 
     bsp[zeile, "FO"]  == bsp[zeile-2, "FO"]+2 & 
     bsp[zeile, "AK2"] == 9){
    bsp[zeile, "AK2"] <- bsp[zeile-2, "AK2"]
  }
  bsp[zeile, "AK2"]
}
bsp
Danke für eure Hilfe!!!

LG
transporter
Antworten