Ich benutze R, und ich habe einen großen Datenrahmen, wo die Anzahl der Zeilen in Millionen ist. Ich interessiere mich speziell in nur einer Spalte, $ Pfad. Innerhalb dieser Daten habe ich einen Index erzeugt, welche Einträge ich ersetzen wollen identifiziert:Ersetze Textzeichenfolge im Dataframe mit einer Wahrscheinlichkeits-Stichprobenalternative
replace.index <- which(df$path == 'First')
und sich vorstellen, dieser Index identifiziert 50 Zeilen.
In einer separaten Tabelle habe ich eine Wahrscheinlichkeitstabelle identifiziert, von der ich "abtasten" möchte, um jeden dieser "Ersten" Einträge zu ersetzen.
Stellen Sie sich diese zweite Einheit eine Reihe von Namen Zahlen „casetable“ genannt:
cum
alpha 18
beta 29
gamma 40
delta 50
, wo diese 50 Spiele der Anzahl der Zeilen ersetzen, ich will.
Ich versuche Aktion eine Art ersetzen zu schreiben, die
18 cases of "First" with "alpha > First"
11 cases of "First" with "beta > First"
11 cases of "First" with "gamma > First"
10 cases of "First" with "delta > First"
und im Wesentlichen überschreibt den Eintrag in jedem der zuvor identifizierten Zeilen in der Haupttabelle ersetzt.
Ich bin zuversichtlich, dass ich dies mit einer for-Schleife ausführen kann, aber für die Geschwindigkeit möchte ich stattdessen eine Anwendungsfunktion verwenden, die ich nicht erarbeiten kann. Ich habe versucht, die folgenden, aber ich kann es nicht richtig machen:
#'Replacement function'
sampleprevious <- function(rndtbl,upperlimit,reattach) {
return(paste0(names(rndtbl[max(which(rndtbl < runif(1, min=1, max=upperlimit)))])
,' > ', reattach))
}
df$path[replace.index] <-
mapply(paste0, sampleprevious(casetable, 50, 'First'))
Dies ist ein Kompromiss Versuch, eine Zufallszahl Probenahme mit, da ich nicht sicher war, wie sonst meine Wiederholungen zu bekommen, aber was ich für Dies ist nur ein einzelner Stichprobenwert, der für jede Zeile und nicht für 50 separate Stichproben erfasst wird.
Ich wäre glücklich mit der Hilfe, um 50 zufällige Samplings zu generieren, aber genauso glücklich mit den abgeleiteten Splits 18 | 11 | 11 | 10 bitte.
* _____________ ** ** Addenda Ich habe das 'Sampling' -Version mit diesem gelöst:
sampleprevious <- function(rndtbl,upperlimit,reattach) {
return(paste0(names(rndtbl[min(which(rndtbl > runif(1, min=1, max=upperlimit-1)))])
,'>', reattach))
}
df$path[replace.index] <-
replicate(50, sampleprevious(casetable, 50, 'First'))
und das gibt mir einen zufälligen Anteil im Einklang mit meinem casetable. Ich würde immer noch lieber genau die Anzahl der Zeilen aus meiner Casetabelle erzeugen.
Die Beziehung zwischen 'Casetable' und das gewünschte Ergebnis ist mir nicht klar. Kannst du es ausarbeiten? Soll es Stichprobengewichte geben? – effel
Ja, ist es. Ich habe vorberechnet, wie viele der 'Ersten' Einträge ich mit jeder neuen Zeichenfolge ersetzen möchte. Die ersten Einträge sind über meinen Datenrahmen verteilt, ich versuche nur, sie zu finden und ersetze sie mit einer Wahrscheinlichkeit von n/50 durch eine neue Zeichenfolge. In meiner Falltabelle habe ich eine kumulative Summe verwendet, um eine einfache Wahrscheinlichkeitsfunktion zu ermöglichen. – Jon