Werte aus Data Frame bedingt ersetzen

Allgemeine Fragen zur Programmierung mit R.

Werte aus Data Frame bedingt ersetzen

Beitragvon Sbalfatue » Di 10. Jul 2018, 16:16

Hallo zusammen

Ich habe folgende Ausgangslage: Ich habe 2 Dataframes. Im ersten habe ich einen "Zeitstempel" (Zeitwerte kommen mehrfach vor), eine Preisangabe und zwei Kontrollvariablen. Im zweiten Datensatz habe ich auch den "Zeitstempel" (Zeitwerte kommen genau einmal vor) und einen alternativen Preis. Also etwa so:

DF1:
    -Zeit (a,b,c,a,d,a,b)
    -Preis ($a, $b, $c, $a, $d, $a, $b)
    -Variable 1 (1,2,3,4,1,2,3)
    -Variable 2 (1,2,2,4,1,4,3)
DF2:
    -Zeit (a,b,c,d,e,f,g)
    -Alternativer Preis ($a, $b, $c, $d, $e, $f, $g)


Nun habe ich folgendes Problem: Ich möchte wenn im DF1 die Variable 1 und die Variable 2 ungleich sind (!=), den dazugehörigen Preiswert durch den Preiswert aus dem DF2 mit dem selben Zeitstempel ersetzen. Wie gehe ich am besten vor? Gibt es eine Ersetzen-Funktion/ Package für 2 Dataframes oder macht man hier am besten einen Loop (sind 70'000 Werte in DF1 und 2'000 Werte in DF2, wie würde es da bei einem Loop mit der Performance aussehen?). Wie würde so ein Loop in etwas aussehen?

Liebe Grüsse
Sbalfatue
Sbalfatue
 
Beiträge: 2
Registriert: Di 10. Jul 2018, 15:41
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Werte aus Data Frame bedingt ersetzen

Beitragvon jogo » Mi 11. Jul 2018, 08:35

Hallo Sbalfatue,

so etwas nennt sich update-join https://stackoverflow.com/questions/129 ... left-right
Leider hast Du Deine Daten nicht in einer Form angegeben, die es einfach ermöglicht, mit diesen Daten zu experimentieren im Sinne eines reproduzierbaren Beispiels.
https://stackoverflow.com/questions/596 ... le-example
http://forum.r-statistik.de/viewtopic.php?f=20&t=11

Code: Alles auswählen
DF1 <- data.frame(
  Zeit=c("a","b","c","a","d","a","b"),
Preis= c(11, 12, 13, 11, 14, 11, 12),
Variable1= c(1,2,3,4,1,2,3),
Variable2= c(1,2,2,4,1,4,3), stringsAsFactors = FALSE)

DF2 <- data.frame(
  Zeit=c("a","b","c","d","e","f","g"),
  AlternativerPreis= c(21, 22, 23, 24, 25, 26, 27), stringsAsFactors = FALSE)
rownames(DF2) <- DF2$Zeit

DF1$neuPreis <- ifelse(DF1$Variable1==DF1$Variable2, DF1$Preis, DF2[DF1$Zeit, "AlternativerPreis"])
## oder
DF1$neuPreis <- DF1$Preis
DF1$neuPreis[DF1$Variable1!=DF1$Variable2] <- DF2[DF1$Zeit[DF1$Variable1!=DF1$Variable2], "AlternativerPreis"]
oder (ohne in DF2 die rownames zu setzen):
Code: Alles auswählen
DF1 <- data.frame(
  Zeit=c("a","b","c","a","d","a","b"),
Preis= c(11, 12, 13, 11, 14, 11, 12),
Variable1= c(1,2,3,4,1,2,3),
Variable2= c(1,2,2,4,1,4,3), stringsAsFactors = FALSE)

DF2 <- data.frame(
  Zeit=c("a","b","c","d","e","f","g"),
  AlternativerPreis= c(21, 22, 23, 24, 25, 26, 27), stringsAsFactors = FALSE)

DF1$neuPreis <- DF1$Preis
DF1$neuPreis[DF1$Variable1!=DF1$Variable2] <- DF2[DF2$Zeit %in% DF1$Zeit[DF1$Variable1!=DF1$Variable2], "AlternativerPreis"]

Hier mal wirklich ein update-join mit data.table
Code: Alles auswählen
DF1 <- data.frame(
  Zeit=c("a","b","c","a","d","a","b"),
Preis= c(11, 12, 13, 11, 14, 11, 12),
Variable1= c(1,2,3,4,1,2,3),
Variable2= c(1,2,2,4,1,4,3), stringsAsFactors = FALSE)

DF2 <- data.frame(
  Zeit=c("a","b","c","d","e","f","g"),
  AlternativerPreis= c(21, 22, 23, 24, 25, 26, 27), stringsAsFactors = FALSE)

library("data.table")
setDT(DF1)
setDT(DF2)
DF1[DF2, on="Zeit", neuPreis := ifelse(x.Variable1==x.Variable2, x.Preis, i.AlternativerPreis)][]


Gruß, Jörg
jogo
 
Beiträge: 89
Registriert: Mo 26. Feb 2018, 09:56
Danke gegeben: 3
Danke bekommen: 0 mal in 0 Post

Re: Werte aus Data Frame bedingt ersetzen

Beitragvon Sbalfatue » Mi 11. Jul 2018, 12:39

Hallo Jörg

Vielen Dank für deine Antwort. Variante 1 hat mir wirklich sehr geholfen.

Liebe Grüsse
Sbalfatue
Sbalfatue
 
Beiträge: 2
Registriert: Di 10. Jul 2018, 15:41
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Werte aus Data Frame bedingt ersetzen

Beitragvon jogo » Mi 11. Jul 2018, 12:57

Hallo Sbalfatue,

wenn Dir die Variante 1 so gut gefallen hat:
man könnte statt des Dataframes DF2 auch einfach einen Vektor mit benannten Elementen nehmen; den Code müsste man nur leicht modifizieren.
Code: Alles auswählen
AlternativerPreis <- c(21, 22, 23, 24, 25, 26, 27)
names(AlternativerPreis) <- c("a","b","c","d","e","f","g") ## Zeit

DF1$neuPreis <- ifelse(DF1$Variable1==DF1$Variable2, DF1$Preis, AlternativerPreis[DF1$Zeit])


Gruß, Jörg
jogo
 
Beiträge: 89
Registriert: Mo 26. Feb 2018, 09:56
Danke gegeben: 3
Danke bekommen: 0 mal in 0 Post


Zurück zu Programmierung allgemein

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron