Schleife zum Datenabgleich

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Jörg
Beiträge: 25
Registriert: Mi Nov 09, 2016 2:58 pm

Schleife zum Datenabgleich

Beitrag von Jörg »

Liebe r-Gemeinde,
ich suche eine Lösung für folgendes Datenzuordnungsproblem.
Ausgangspunkt ist die Tab_alt, in der einer Variablen y bereits in drei Fällen der Wert einer Variable x zugeordnet wurde. In den letzten 3 Zeilen fehlt der x-Wert noch, daher NA.

Tab_alt:
x y
a2 P01
d4 P02
d1 P03
NA P04
NA P05
NA P06

Der Vektor x_neu enthält drei x-Werte ("r5","d4","gt"). Einer („d4“) ist bereits in Tab_alt enthalten, die zwei anderen noch nicht. Die Daten dieses Vektors sollen nun mit den Werten in Tab_alt abgeglichen, Tab_alt gegebenfalls angeglichen und als Tab_neu gespeichert werden:

Inhaltlich wäre die Vorgehensweise folgende:
1. Überprüfe für jeden Wert in x_neu, ob er in der Spalte Tab_alt$x bereits vorkommt.
2. Wenn ja, mache nichts.
3. Wenn nein, ersetze den ersten NA-Wert in Tab_alt$x mit dem jeweiligen x-Wert und speichere dies.
4. Wiederhole dies für jeden Wert in x_neu.
5. Speichere das Ergebnis als Tab_neu.

Im konkreten Fall wäre das gewünschte Ergebnis folgende Tab_neu:
x y
a2 P01
d4 P02
d1 P03
r5 P04
gt P05
NA P06

Das sollte doch über eine Schleifenfunktion machbar sein?
Unten findet Ihr den Code, um das Beispiel zu generieren.
Für Hilfe bin ich wie immer sehr dankbar.
Herzliche Grüße
Jörg

Code: Alles auswählen

x0<-c("a2","d4","d1","NA","NA","NA")
y0<-c("P01","P02","P03","P04","P05","P06")
Tab_alt<-cbind(x=x0,y=y0)

x_neu<-c("r5","d4","gt")

x1<-c("a2","d4","d1","r5","gt","NA")
y1<-c("P01","P02","P03","P04","P05","P06")
Tab_neu<-cbind(X=x1,Y=y1)
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: Schleife zum Datenabgleich

Beitrag von Hufeisen »

Hallo,

in deinem Beispiel hast du die NA-Werte als Text "NA" statt als fehlenden Wert NA deklariert. Ansonsten habe ich die Aufgabe ohne Schleife gelöst. Hoffentlich ist alles so richtig und es ist nicht unnötig kompliziert:

Code: Alles auswählen

# Daten erstellen
x0 <- c("a2", "d4", "d1", NA , NA , NA)
y0 <- c("P01", "P02", "P03", "P04", "P05", "P06")
Tab_alt <- cbind(x = x0, y = y0)

x_neu <- c("r5", "d4", "gt")

Tab_neu <- Tab_alt

# Position der NA ermitteln
freie_plätze <- is.na(Tab_alt[, "x"])

# Anzahl NA ermitteln
anzahl_NA <- sum(freie_plätze)

# Vergleich ob Werte in x_neu nicht bereits in Tab_alt[, "x"] vorhanden sind
anzahl_neue_werte <- sum(!(x_neu %in% Tab_alt[, "x"]))

# die neuen Werte
neue_werte <- x_neu[!(x_neu %in% Tab_alt[, "x"])]

# Vektoren gleicher Länge erzeugen
  ifelse(anzahl_NA >= anzahl_neue_werte, 

    # Variante 1 - gleich viele oder mehr NA in Tab_alt x als neue Werte
    neue_werte <- c(neue_werte, rep(NA, (anzahl_NA - anzahl_neue_werte))),
    
    # Variante 2 - keine oder weniger NA in Tab_alt x als neue Werte
    neue_werte <- neue_werte[0:anzahl_NA])
 
                  
# Daten eintragen
Tab_neu[freie_plätze, "x"] <- neue_werte  

# Output erzeugen
> Tab_neu
     x    y    
[1,] "a2" "P01"
[2,] "d4" "P02"
[3,] "d1" "P03"
[4,] "r5" "P04"
[5,] "gt" "P05"
[6,] NA   "P06"
Jörg
Beiträge: 25
Registriert: Mi Nov 09, 2016 2:58 pm

Re: Schleife zum Datenabgleich

Beitrag von Jörg »

Hallo, super, arbeitet perfekt, vielen Dank!
Antworten