2016-09-15 6 views
3

Ich möchte habe ich sah in diesen Fragen bisher zufällig NA zu einem data.frame in R. hinzuzufügen:genaue Anteil der zufälligen fehlenden Werte in den data.frame

R: Randomly insert NAs into dataframe proportionaly

How do I add random NAs into a data frame

add random missing values to a complete data frame (in R)

Viele Lösungen wurden hier zur Verfügung gestellt, aber ich konnte nicht finden, die mit diesen 5 Bedingungen erfüllen:

  • hinzufügen wirklich zufällig NA und nicht die gleiche Menge von Zeile oder Spalte durch
  • Arbeit mit jeder Klasse von Variablen, die man in einem data.frame (nummerisch, Zeichen, Faktor, logisch, ts ..) begegnen kann Daher muss die Ausgabe das gleiche Format haben wie die Eingabedaten.Frame oder Matrix.
  • Garantie eine genaue Zahl oder Anteil [Anmerkung] von NA in der Ausgabe (viele Lösungen, da mehrere in einer kleineren Anzahl von NA ergeben, wird am gleichen Ort erzeugt)
  • Ist computationnaly effizient für große Datensätze.
  • Fügen Sie das Verhältnis/die Anzahl der NA unabhängig von der bereits vorhandenen NA im Eingang hinzu.

Wer hat eine Idee? Ich habe bereits versucht, eine Funktion zu schreiben, dies zu tun (in einer Antwort der ersten Verbindung), aber es steht nicht im Einklang mit den Punkten N ° 3 & 4. Dank.

[Anmerkung] Der genaue Anteil, gerundet auf +/- 1NA natürlich.

+0

Können Sie das näher erläutern, wie [diese Antwort] (http://stackoverflow.com/a/27454361 erhöhen würde/3627607) ist dir nicht genug? (Und zumindest, den Anteil von NA zu überprüfen und einen weiteren Durchlauf mit dem fehlenden Prozentsatz zu wiederholen, sollte auch tun) – Tensibai

+0

@Tensibai ja danke das ist was ich meine, ich möchte direkt den richtigen Anteil/Anzahl von NA ausgeben. Wenn Sie Ihren Vorschlag ändern können, um dies zu tun, würde ich froh sein, – agenis

+0

Ich kann nicht, es ist eine vorhandene Antwort, ich sehe nicht, wie man mehr darauf erarbeiten.Ich brauche nicht genau ein Prozent zu haben (was an sich schon ein Unsinn ist). Die Proposition von NA zu erhalten ist einfach ('sum (is.na (df)/(now (df) * ncol (df)))' und checking, wenn es in einem akzeptablen Bereich ist, wenn nicht, addiere die NA erneut. – Tensibai

Antwort

3

Dies ist die Art und Weise, wie ich es für meine Arbeit an library(imputeMulti) mache, die derzeit bei JSS überprüft wird. Dies fügt NA ‚s in einem zufälligen Prozentsatz des gesamten Datensatzes und skaliert gut, spielt es keine Garantie eine genaue Zahl wegen des Falles von n * p * pctNA %% 1 != 0.

createNAs <- function (x, pctNA = 0.1) { 
    n <- nrow(x) 
    p <- ncol(x) 
    NAloc <- rep(FALSE, n * p) 
    NAloc[sample.int(n * p, floor(n * p * pctNA))] <- TRUE 
    x[matrix(NAloc, nrow = n, ncol = p)] <- NA 
    return(x) 
} 

Offensichtlich sollten Sie einen Zufallskeim für die Reproduzierbarkeit verwenden, die vor dem Funktionsaufruf angegeben werden können. Diese

arbeitet als allgemeine Strategie für die Erstellung von Baseline-Datensätze zum Vergleich über Imputationsmethoden. Ich glaube, das ist, was Sie wollen, obwohl Ihre Frage (wie in den Kommentaren erwähnt) nicht klar angegeben ist.

bearbeiten: Ich nehme an, dass x abgeschlossen ist. Ich bin also nicht sicher, wie es mit den fehlenden Daten umgehen würde. Sie könnten sicherlich den Code ändern, wenn Sie wollen, obwohl das wahrscheinlich die Laufzeit von mindestens O (n * p)

+0

Danke. Genau das brauche ich. Ich habe meine Frage präzisiert und erwähne die Rundung bei einer Proportion. – agenis

Verwandte Themen