2016-06-13 5 views
0

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.

+1

Die Beziehung zwischen 'Casetable' und das gewünschte Ergebnis ist mir nicht klar. Kannst du es ausarbeiten? Soll es Stichprobengewichte geben? – effel

+0

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

Antwort

0

Reproduzierbare Daten, bei denen die tension Variable Ihre path ist:

data(warpbreaks) 
warpbreaks$tension <- as.character(warpbreaks$tension) 

casetable geben die Wiederbeschaffungswerte und ihre Gewichte.

casetable <- data.frame(replacement = letters[1:3], n = c(2, 4, 6), 
         stringsAsFactors = FALSE) 
# replacement n 
# 1   a 2 
# 2   b 4 
# 3   c 6 

Wir müssen wissen, wie viele Ersetzungen zu probieren.

subset_n <- sum(warpbreaks$tension == "L") 
# [1] 18 

Probe subset_n Werte aus der Spalte von replacementcasetable, mit Wahrscheinlichkeiten von seinen n Spalt und ersetzen die vorhandenen Werte der tension Spalte in warpbreakstension wo ein bestimmten Wert ist, L.(Dies ist First in Ihren Daten.)

warpbreaks[warpbreaks$tension == "L", "tension"] <- 
    sample(casetable$replacement, size = subset_n, replace = TRUE, 
     prob = casetable$n) 
warpbreaks 
# breaks wool tension 
# 1  26 A  c 
# 2  30 A  b 
# 3  54 A  c 
# 4  25 A  c 
# 5  70 A  c 
# 6  52 A  a 
# 7  51 A  b 
# 8  26 A  b 
# 9  67 A  c 
# 10  18 A  M 
# 11  21 A  M 
# 12  29 A  M 
+0

Ja - ich kann dem folgen, danke. Ich glaube, ich habe entschieden, dass ich eine Art Listenfunktion brauche, aber ich kann die Daten einfach aus einer Liste einlesen, indem ich sie zuweise. Vielen Dank, Frage beantwortet. – Jon

Verwandte Themen