2017-12-11 3 views
1

Ich bin mir sicher, dass es einen sehr einfachen Weg gibt, um diese Aufgabe zu erfüllen, aber ich kann es nicht herausfinden. Ich habe zwei Datenrahmen, die genau die gleichen Daten haben, aber von zwei verschiedenen Orten.Konvertiere Werte in einem Datenrahmen in NA basierend auf NAs in einem zweiten Datenrahmen

df1 <- data.frame(a=c(1,2,3,NA),b=c(1,5,4,6)) 
df2 <- data.frame(a=c(3,4,5,6),b=c(7,8,9,NA)) 

My gewünschte Ausgabe ist, zwei haben eine neue Version von DF1 und DF2, die exakt die gleichen sind, aber die untere Reihe enthält nur NA-Werte. I.e. wenn es einen NA-Wert in einem Datenrahmen ist, ich brauche, dass auf die entsprechende Zelle in den anderen Datenrahmen replizierten ...

df1[4,2] <- NA 
df2[4,1] <- NA 

I haben sehr ähnliche Fragen gesehen das Problem, aus der entgegengesetzten Perspektive Adressierung (zB Filling missing values in a data.frame from another data.frame) aber ich kann mir nicht vorstellen, wie ich das auf meine eigenen Daten anwenden soll. Vielen Dank im Voraus.

Antwort

3

Wir können einen Index erstellen, basierend auf dem Auftreten von NA in einem der beiden Datensätze und

i1 <- NA^(is.na(df1)| is.na(df2)) 
df1 <- df1 * i1 
df2 <- df2 * i1 
+1

Perfektes Dankeschön dafür. Ich werde ankreuzen, sobald es mir erlaubt. –

+0

Interessant. Also 'NA^FALSE' == 1 und' NA^TRUE' == NA. Weißt du, warum das so ist? –

+0

@EricWatt Die binäre Darstellung heißt 'NA^1 'ist NA während' NA^0' ist 1 – akrun

3

Hier multiplizieren sind einige Möglichkeiten. (1) scheint die sauberste und klarste Absicht zu sein. (3) funktioniert, scheint aber im Hinblick auf das Aussortieren von Nebenwirkungen unnötig komplex zu sein.

1) ersetzen Versuchen Sie replace.

df1new <- replace(df1, is.na(df2), NA) 
df2new <- replace(df2, is.na(df1), NA) 

fortsetzen Dies würde, wenn df1new und df2new mit df1 und df2 ersetzt wurden arbeiten, obwohl es Komplexität hinzufügt. In diesem Fall könnte es besser sein, danach df1 und df2 (d. H. df1 <- df1new; df2 <-df2new) zuzuordnen, um Komplexität zu vermeiden.

2) Indizierung Es abwechselnd wie folgt geschrieben werden:

df1new <- df1 
df1new[is.na(df2)] <- NA 

df2new <- df2 
df2new[is.na(df1)] <- NA 

3) destruktiv Indizierung Nicht sicher, dass dies eine gute Idee ist, aber es funktioniert hier:

df1[is.na(df2)] <- df2[is.na(df1)] <- NA 
Verwandte Themen