Seite 1 von 1

Zielen hinzufügen

Verfasst: Di Feb 23, 2021 5:59 pm
von steven_y
Ich möchte einen Paneldatensatz erweitern und neue Beobachtungszeiträume hinzufügen. Dabei soll für jede Gruppe der Wert der letzten verfügbaren Beobachtung für die neuen Beobachtungspunkte verwendet werden.

Hier ist der Ausgangs DF:

Code: Alles auswählen

date <- c(1,2,1,2)
id <- c('x','x','y','y')
value_1 <- c(22,33,44,55)

have <- data.frame(date,id,value_1)
Das Ergebnis soll so aussehen:

Code: Alles auswählen

date <- c(1,2,3,4,1,2,3,4)
id <- c('x','x','x','x','y','y','y','y')
value_1 <- c(22,33,33,33,44,55,55,55)

want <- data.frame(date,id,value_1)
Lässt sich das geschickt ohne Loops etc lösen?

Re: Zielen hinzufügen

Verfasst: Di Feb 23, 2021 6:39 pm
von schubbiaschwilli
Gude!

Hm, einfach eine neue Spalte anfügen?

Code: Alles auswählen

have$value_1_new <- c(...)
Und danach den Datensatz teilen und anhängen mit rbind (u.U. musst du 2 Dataframes erstellen, die Spalten neu benennen)?

Dank&Gruß
Schubbiaschwilli

Re: Zielen hinzufügen

Verfasst: Di Feb 23, 2021 6:51 pm
von steven_y
Besten Dank für das schnelle Feedback. Kannst du das vielleicht noch etwas erläutern?

Ich muss doch zunächst zwei leere Zeilen hinzufügen sofern date = 2. Der Wert für date ist dann 3 bzw. 4. Anschließend kopiere ich die restlichen Werte (es sind mehr als nur value_1) aus date = 2.

Re: Zielen hinzufügen

Verfasst: Di Feb 23, 2021 8:09 pm
von schubbiaschwilli
Gude!

Mit

Code: Alles auswählen

have$NeueSpalte <- NA
kannst du eine neue Spalte anfügen (die natürlich auch anders heißen kann) - Das verstehe ich unter 'neue Beobachtungszeiträume'.
Wenn du nun die neue Spalte mit den Werten der alten füllst, also

Code: Alles auswählen

have$NeueSpalte <- have$AlteSpalte
Passiert das: 'Dabei soll für jede Gruppe der Wert der letzten verfügbaren Beobachtung für die neuen Beobachtungspunkte verwendet werden.'
Oder verstehe ich da was falsch?

Dank&Gruß
Schubbiaschwilli

Re: Zielen hinzufügen

Verfasst: Mi Feb 24, 2021 8:35 am
von steven_y
Ja, ich habe mich unklar ausgedrückt.

Ich möchte neue Zeilen (keine Spalten) hinzufügen. Immer nach date=2 sollen zwei Zeilen eingefügt werden, bis auf den Wert für date werden die Werte für alle anderen Spalten aus der date=2 Zeile übernommen. Date bekommt die Werte 3 bzw. 4.

Re: Zielen hinzufügen

Verfasst: Mi Feb 24, 2021 9:01 am
von Athomas
Wir bekommen hier häufiger Fragen gestellt, in denen der Fragesteller nicht sein eigentliches Problem darstellt, sondern das, was er als einen naheliegenden Schritt auf dem Weg zur Lösung empfindet.

Oft werden aber die Probleme durch diesen Ansatz komplizierter - was möglicherweise erst nach mehreren Tagen fruchtlosen Hin und Hers bemerkt wird.

Deshalb frage ich mal direkt nach dem "eigentlichen" Problem :) !?

Re: Zielen hinzufügen

Verfasst: Mi Feb 24, 2021 1:27 pm
von bigben
Ganz banal ist das nicht - der Logik nach erscheint es mir am einfachsten, die Daten erst in ein breites/weites Format umzuwandeln, an dem dann die nötigen Änderungen vorzunehmen und danach ins lange Format rückzuwandeln.

Beispielhaft nehme ich für die Umwandlungen mal die Funktionen dcast und melt aus dem Paket data.table. Natürlich gibt es da viele Alternativen. Auch das einfügen der Daten habe ich eher simple gehalten, das wird im echten Code ja ohnehin anders sein.
Aber um erstmal das Prinzip zu zeigen:

Code: Alles auswählen

# Datenvorbereitung von Dir übernommen
date <- c(1,2,1,2)
id <- c('x','x','y','y')
value_1 <- c(22,33,44,55)
have <- data.frame(date,id,value_1)

# Umwandlung ins breite Format, in diesem Fall mit data.table
library(data.table)
setDT(have)
have.wide <- dcast(have, date ~ id, value.var = "value_1")
print(have.wide)

# Im weiten Format hängen wir jetzt die zweite Zeile noch zweimal an:
have.wide <- rbind(have.wide, have.wide[c(2, 2),])
# und korrigieren das Datum
have.wide[3, "date"] <- 3
have.wide[4, "date"] <- 4
print(have.wide)

# und jetzt zurück ins lange Format
want <- melt(have.wide, id.vars = "date")
print(want)
LG,
Bernhard

Re: Zielen hinzufügen

Verfasst: Mi Feb 24, 2021 1:39 pm
von schubbiaschwilli
Gude!
Ganz banal ist das nicht - der Logik nach erscheint es mir am einfachsten, die Daten erst in ein breites/weites Format umzuwandeln (...)
Was auch meine Idee war - Und aus diesem Grund auf die Ausführungen gespannt bin, da ich auch immer bei diesen 'einfachen' Sachen hänge...

Dank&Gruß
Schubbiaschwilli