Zielen hinzufügen

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

Moderatoren: EDi, jogo

Antworten
steven_y
Beiträge: 25
Registriert: Do Nov 19, 2020 12:16 pm

Zielen hinzufügen

Beitrag 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?
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Zielen hinzufügen

Beitrag 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
steven_y
Beiträge: 25
Registriert: Do Nov 19, 2020 12:16 pm

Re: Zielen hinzufügen

Beitrag 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.
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Zielen hinzufügen

Beitrag 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
steven_y
Beiträge: 25
Registriert: Do Nov 19, 2020 12:16 pm

Re: Zielen hinzufügen

Beitrag 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.
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Zielen hinzufügen

Beitrag 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 :) !?
bigben
Beiträge: 2777
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zielen hinzufügen

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
schubbiaschwilli
Beiträge: 253
Registriert: Di Jun 27, 2017 12:09 pm

Re: Zielen hinzufügen

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