2015-08-07 8 views
6

Chciałbym użyć mutacji do obliczenia kolumny przy użyciu rozkładu dwumianowego.dplyr mutate za pomocą rbinom nie zwracaj losowych liczb

Mam następujący przykład:

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) 
     ) 

Wynik jest tak:

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 

ja nie rozumiem - Chcę funkcję mutate zwraca losową liczbę wyciągnąć z dwumianowy dystrybucja podana przez ref i pokrycia ("ref2") ...

Mutuj poprawnie odczytać kolumny - ale coś dziwnego dzieje się podczas wywoływania rbinom ...

Każda pomoc, którą doceniam.

Odpowiedz

11

Spróbuj zmienić n z rbinom:

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

lub bardziej ogólnie:

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

Jeszcze bardziej ogólnym rozwiązaniem jest 'rbinom (n(), coverage, eprob)', ponieważ 'n()' znajduje rozmiar wszystkich mutacji danych. (To też będzie działać z zgrupowanymi tabelami) –

+0

@DavidRobinson - Tak, to jest lepsze. Zmienię moją odpowiedź, aby to odzwierciedlić. Dzięki. – Alex

+0

Ale czy po prostu nie użyje tej samej wartości epoki dla wszystkich 100 losowań? (To nie jest to, czego chcę - i nie chcę narysować 1 liczby ze 100 różnych rozkładów dwumianowych, ponieważ eprob przyjmuje 100 różnych wartości). – pallevillesen

1

Innym rozwiązaniem byłoby:

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

Jeżeli rowwise() grupy dowodzenia autorstwa (każdy) wiersz i określa, że ​​potrzebujesz 1 losowa wartość dla każdego rzędu.

+1

Działa to, ale jest * znacznie * wolniejsze, ponieważ liczba wierszy wzrasta. – Alex

+0

Ale myślę, że to jest jedyny, który daje poprawną odpowiedź, ponieważ epops jest inny dla każdego rzędu - będę musiał przetestować to w poniedziałek - ale jestem naprawdę, naprawdę wdzięczny za roboczą odpowiedź - odkąd odkryłem ten błąd w mój kod już dziś - i jesteśmy blisko składania papieru - dzięki! – pallevillesen

+0

Zignoruj ​​mój komentarz - oba rozwiązania działają świetnie. Pierwsza jest szybsza - ale składnia ostatniej może być bardziej intuicyjna (?) – pallevillesen

Powiązane problemy