Seite 1 von 2
Zahlenreihen ergänzen (if-Schleife)
Verfasst: Mi Mär 03, 2021 9:18 pm
von JPWJS
Hallo,
ich habe eine Tabelle mit Daten die zu verschiedenen Jahren aufgenommen wurden. Die Daten wurden jährlich erhoben, aber nur abgespeichert wenn Änderungen auftraten. Für die Auswertung brauche ich aber alle Jahre (auch die, die nicht in der Tabelle sind). (CSV im Anhang).
Meine Idee war, die Zeilen zu vergleichen und je nach Prüfungsergebnis die zu ergänzende Zeile einzufügen, indem das Vorjahr kopiert und die Jahreszahl eins hochgesetzt wird.
Bisher funktionert es allerdings nur über die rep()-Funktion die Zeile zu kopieren und ans Ende der Tabelle zu hängen, ohne das Jahr zu erhöhen.
if(testVariable$BaumID[x] == testVariable$BaumID[x+1] &
testVariable$Jahr[x]+1 == testVariable$Jahr[x+1] ) "YES" else (
c<-rbind(testVariable, rep(testVariable[x,1:10])))
Gibt es eine Möglichkeit, das Jahr zu erhöhen und dann nach ID und Jahr zu sortieren?
Vielen Dank für Eure Hilfe!
Re: Zahlenreihen ergänzen (if-Schleife)
Verfasst: Mi Mär 03, 2021 9:52 pm
von bigben
Ist schon spät, deshalb kommt heute von mir nicht mehr viel. Google mal R in Verbindung mit locf. Das steht für last observation carried forward. Ich meine da vor langer Zeit mal nützliches gesehen zu haben. Hab das aber nie selbst genutzt.
Schönen Abend noch,
Bernhard
Re: Zahlenreihen ergänzen (if-Schleife)
Verfasst: Mi Mär 03, 2021 9:57 pm
von EDi
http://if-schleife.de/
Ich würde das aus einer Kombination aus tidyr::expand (um auf die vollen jahre zu kommen, geht auch mit einem join...) und tidyr::fill (für das schon erwähnte locf) machen...
Re: Zahlenreihen ergänzen (if-Schleife)
Verfasst: Fr Mär 05, 2021 11:12 am
von JPWJS
Hallo,
vielen Dank für die bisherigen Hinweise.
Das klingt von den Beschreibungen der Funktionen nach dem richtigen Weg. Nur habe ich bisher noch nicht die richtige Funktionseingabe herusgefunden, dass die Tabelle erweitert wird.
Die Tabelle ist folgend aufgebaut (verkürzt dargestellt):
ID Jahr Messwert
1 2011 1
1 2014 2
Dort soll jetzt für die Jahre 2012 und 13 der Messwert 1 ergänzt werden. In meinen bisherigen Versuchen mit expand() zählt mir die Funktion die auftretenden Kombination auf, ergänzt einige Kombinationen, die in der Originaltabelle enthalten sind, aber speichert die nicht ab, bzw ich finde die nicht.
Gibt es eine Funktionsbeschreibung zum Packet tidyr bzw zu der Funktion expand mit den "Unterfunktionen" in Deutsch?
Vielen Dank
Re: Zahlenreihen ergänzen (if-Schleife)
Verfasst: Fr Mär 05, 2021 12:34 pm
von JPWJS
Guten Tag,
über die expand() kombiniert mit full_seq() [expand(testVariable, testVariable$BaumID, full_seq(testVariable$Jahr,1))] bekomme ich ein 'tibble' das jetzt soweit ich das überblicke die von mir erwünschten Kombinationen aus ID und Jahr enthält, also jede ID ist jedes Jahr vorhanden.
ABER
Wo speichert R das tibble und wie bekomme ich es dann in meine (Ursprungs-)Tabelle?
Vielen Dank vorab für Antworten und Hilfen
Re: Zahlenreihen ergänzen (if-Schleife)
Verfasst: Fr Mär 05, 2021 3:09 pm
von EDi
Wo speichert R das tibble?
Je nachdem was du haben willst und es R sagst:
Im workspace, auf der Festplatte, in googlesheets, in einer Datenbank,...
Für ersteres gibt es den "Assignment Operator"
Man kann auch ?.Last.value verwenden, wenn man das Ergebnis nicht einem Namen zuordnen will.
Das ist aber eine sehr grundlegende Frage zu R und vielleicht solltest du dich noch etwas in die Grundlagen einarbeiten?
und wie bekomme ich es dann in meine (Ursprungs-)Tabelle
Das kann man z.b. mit einem "join" machen.
Re: Zahlenreihen ergänzen (if-Schleife)
Verfasst: So Mär 07, 2021 12:18 pm
von JPWJS
Hallo,
vielen Dank für die Hinweise und Hilfestellungen.
Das ist aber eine sehr grundlegende Frage zu R
ja, manchmal übersehe ich das einfachste
Ich habe meine Tabelle jetzt mit einer Kombi aus expand, join und fill zusammengesetzt bekommen. Mir fehlt jetzt nur noch ein letzter Schritt, den ich in der expand-Funktion vermute.
Für die einzelnen Bäume [$BaumID] gibt es unterschiedliche Ersterfassungen. Die expand-Funktion erweitert jedoch auf alle möglichen Kombinationen, so dass es am Ende Messwerte für Bäume vor deren Ersterfassung gibt, die sich über die fill-Funktion mit Daten des vorherigen Baumes füllen.
Wie kann ich meinen expand() entsprechend anpassen, dass für jede ID nicht
vor dem ersten Jahr ergänzt wird?
exp <- expand(testVariable, testVariable$BaumID, testVariable$Jahr)
Vielen Dank
Jens
Re: Zahlenreihen ergänzen (if-Schleife)
Verfasst: So Mär 07, 2021 6:46 pm
von EDi
Du kannst die doch auch danach wieder rauswerfen:
Für jeden Baum, behalte nur die Zeilen die größer als Erstdatum sind.
Oder halt den mix aus expand und fill pro baum anwenden (am besten dazu ein funktion schreiben).
Ohne ein reproduzierbares Beispiel kann ich aber leider auch nichts konkreteres sagen

Re: Zahlenreihen ergänzen (if-Schleife)
Verfasst: So Mär 07, 2021 8:32 pm
von JPWJS
Hallo, so sieht mein bisheriger Code aus, der die Tabelle einliest und ergänzt, könnte man sicherlich schöner gestallten, aber funktioniert soweit.
Code: Alles auswählen
#Tabelle einlesen
testVariable <- read.csv("testVariable.CSV", header = TRUE, sep = ";", na.strings = "NA")
#erweitern
exp <- expand(testVariable, testVariable$BaumID, testVariable$Jahr)
#Erweiterungen an die Tabelle einfügen
join<-right_join(testVariable, exp, by = c("BaumID"="testVariable$BaumID", "Jahr"="testVariable$Jahr")
,copy = TRUE, keep= FALSE, na.strings="NA")
#Tabelle sortieren
joinord <- join[
order( join[,1], join[,5] ),
]
#Tabelle ergänzen
test <- joinord %>% fill(Vitalität, Stammumfang.cm, Kronendurchmesser.m,
Höhe.m, Entwicklungsphase, .direction = "down")
beigefügt ein kurzer Auszug aus der Gesamtdatei.
Im jetztigen Durchlauf, wird für Baum 2 die Jahre 2004 und 2006 erstellt die leer bleiben, allerdings entstehen für Baum 3 ebenfalls die Jahre 2004 und 2006, die mit den letzten Werten von Baum 2 gefüllt werden.
Für jeden Baum, behalte nur die Zeilen die größer als Erstdatum sind.
Dasklingt nach drop_na-Funktion kombiniert mit einer if-Abfrage innerhalb einer for-Schleife1?
Eine Funktion zu schreiben klingt spannend, müsste dann aber vermutlich auch mit einer for-Schleife laufen, da bei 36.000 Bäumen das sehr aufwendig wäre für jeden einzelnen.
Ich hoffe, das Bespiel ist reproduzierbar, da ich mich über konkretes sehr freuen würde.
Grüße
Jens
Re: Zahlenreihen ergänzen (if-Schleife)
Verfasst: So Mär 07, 2021 11:44 pm
von Athomas
Guckst Du hier:
Code: Alles auswählen
library(data.table)
Eingabe <- file.choose()
Daten <- fread(Eingabe, sep=";",dec=",")
setkey(Daten, BaumID,Jahr)
Extrakt <- Daten[ , .(minJahr=min(Jahr), maxJahr=max(Jahr)), by=BaumID]
Jahre <- Extrakt[ , .(Jahr=(minJahr:maxJahr)), by=BaumID]
setkey(Jahre, BaumID,Jahr)
Ergebnis <- Daten[Jahre, roll=TRUE]
Aber Vorsicht, unter Einfluß von Drogen (Riesling) entstanden!