Seite 1 von 1

Wert auf vorletzten Wert umcodieren

Verfasst: Mi Apr 15, 2020 6:56 pm
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:

Re: Wert auf vorletzten Wert umcodieren

Verfasst: Mi Apr 15, 2020 10:09 pm
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

Re: Wert auf vorletzten Wert umcodieren

Verfasst: Do Apr 16, 2020 9:56 am
von transporter
Ich werde es versuchen!
LG
transporter

Re: Wert auf vorletzten Wert umcodieren

Verfasst: Do Apr 16, 2020 12:58 pm
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

Re: Wert auf vorletzten Wert umcodieren

Verfasst: Fr Apr 17, 2020 8:26 am
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

Re: Wert auf vorletzten Wert umcodieren

Verfasst: Fr Apr 17, 2020 2:28 pm
von transporter
Hallo ihr Beiden,
ich bin begeistert! Ich setze mich dran und lasse hören
LG
transporter

Re: Wert auf vorletzten Wert umcodieren

Verfasst: Sa Apr 18, 2020 1:40 pm
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