2015-08-07 12 views
6

Ich würde gerne Mutate verwenden, um eine Spalte mit der Binomialverteilung zu berechnen.dplyr mutieren mit rbinom geben keine Zufallszahlen zurück

Ich habe folgendes Beispiel:

library("dplyr") 

d = data.frame(ref = rbinom(100,100,0.5)) 
d$coverage = 100 
d$prob = 0.5 
d$eprob= d$ref/d$coverage 
d = tbl_df(d) 

mutate(d, 
     ref1= ref, 
     cov1 = coverage, 
     eprob1 = eprob, 
     ref2=rbinom(1, coverage, eprob), 
     ref3=rbinom(1, cov1, eprob1) 
     ) 

Ergebnis ist wie folgt:

Source: local data frame [100 x 9] 

    ref coverage prob eprob ref1 cov1 eprob1 ref2 ref3 
1 52  100 0.5 0.52 52 100 0.52 45 44 
2 50  100 0.5 0.50 50 100 0.50 45 44 
3 45  100 0.5 0.45 45 100 0.45 45 44 
4 45  100 0.5 0.45 45 100 0.45 45 44 
5 47  100 0.5 0.47 47 100 0.47 45 44 
6 46  100 0.5 0.46 46 100 0.46 45 44 
7 50  100 0.5 0.50 50 100 0.50 45 44 
8 53  100 0.5 0.53 53 100 0.53 45 44 
9 44  100 0.5 0.44 44 100 0.44 45 44 
10 56  100 0.5 0.56 56 100 0.56 45 44 

Ich verstehe es nicht - ich die mutieren Funktion wollen aus der binomischen gezogen, um eine Zufallszahl zurück Verteilung durch Ref und Coverage (die "Ref2") ...

Mutate lesen Sie die Spalten richtig - aber etwas seltsames passiert, wenn Sie rbinom aufrufen ...

Jede Hilfe, die ich schätze.

Antwort

11

Versuchen Sie, die n von rbinom:

mutate(d, 
    ref1= ref, 
    cov1 = coverage, 
    eprob1 = eprob, 
    ref2=rbinom(100, coverage, eprob), 
    ref3=rbinom(100, cov1, eprob1) 
) 

Oder allgemeiner:

mutate(d, 
    ref1= ref, 
    cov1 = coverage, 
    eprob1 = eprob, 
    ref2=rbinom(n(), coverage, eprob), 
    ref3=rbinom(n(), cov1, eprob1) 
) 
+3

Eine noch allgemeinere Lösung ist 'rbinom (n(), coverage, eprob)', da 'n()' die Größe der Daten findet, die gerade mutiert werden. (Dies funktioniert auch mit gruppierten Tabellen) –

+0

@DavidRobinson - Ja, das ist besser. Ich werde meine Antwort bearbeiten, um das zu reflektieren. Vielen Dank. – Alex

+0

Aber wird dies nicht den gleichen Eprob-Wert für alle 100 Draws verwenden? (Dies ist nicht was ich will - ich möchte 1 Zahl aus 100 verschiedenen Binomialverteilungen zeichnen, da Eprob 100 verschiedene Werte annimmt). – pallevillesen

1

Eine andere Lösung wäre:

d %>% rowwise() %>% 
     mutate(ref1= ref, 
      cov1 = coverage, 
      eprob1 = eprob, 
      ref2=rbinom(1, coverage, eprob), 
      ref3=rbinom(1, cov1, eprob1)) 

Wo die rowwise() Befehlsgruppen durch (je) Zeile und gibt an, dass Sie 1 benötigen zufälliger Wert für jede Zeile.

+1

Das funktioniert, ist aber * viel * langsamer, wenn die Anzahl der Zeilen zunimmt. – Alex

+0

Aber ich denke, das ist das einzige, das die richtige Antwort gibt, da das Eprob für jede Zeile anders ist - ich werde es Montag testen müssen - aber ich bin wirklich, wirklich dankbar für eine funktionierende Antwort - seit ich diesen Fehler entdeckt habe mein Code früher heute - und wir sind kurz davor, das Papier einzureichen - also danke! – pallevillesen

+0

Ignoriere meinen Kommentar - beide Lösungen funktionieren großartig. Der erste ist schneller - aber die Syntax für den letzten kann intuitiver sein (?) – pallevillesen

Verwandte Themen