Zahlenreihen ergänzen (if-Schleife)

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

JPWJS
Beiträge: 12
Registriert: Mi Mär 03, 2021 9:08 pm

Zahlenreihen ergänzen (if-Schleife)

Beitrag 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!
Dateianhänge
testVariable.CSV
(1021 Bytes) 72-mal heruntergeladen
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zahlenreihen ergänzen (if-Schleife)

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Zahlenreihen ergänzen (if-Schleife)

Beitrag 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...
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
JPWJS
Beiträge: 12
Registriert: Mi Mär 03, 2021 9:08 pm

Re: Zahlenreihen ergänzen (if-Schleife)

Beitrag 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
JPWJS
Beiträge: 12
Registriert: Mi Mär 03, 2021 9:08 pm

Re: Zahlenreihen ergänzen (if-Schleife)

Beitrag 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
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Zahlenreihen ergänzen (if-Schleife)

Beitrag 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"

Code: Alles auswählen

?`<-`

Code: Alles auswählen

1 + 2
x <- 1 + 2
x
Man kann auch ?.Last.value verwenden, wenn man das Ergebnis nicht einem Namen zuordnen will.

Code: Alles auswählen

2 + 3
.Last.value
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.
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
JPWJS
Beiträge: 12
Registriert: Mi Mär 03, 2021 9:08 pm

Re: Zahlenreihen ergänzen (if-Schleife)

Beitrag 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
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: Zahlenreihen ergänzen (if-Schleife)

Beitrag 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 :(
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
JPWJS
Beiträge: 12
Registriert: Mi Mär 03, 2021 9:08 pm

Re: Zahlenreihen ergänzen (if-Schleife)

Beitrag 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") 
testVariable.CSV
(1.01 KiB) 70-mal heruntergeladen
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
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Zahlenreihen ergänzen (if-Schleife)

Beitrag 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!
Antworten