2012-06-21 3 views
0

В симуляции, которую я программирую, на каждой итерации мне нужно вычислить сумму некоторых случайных чисел пуассонов для каждой строки в кадре данных, где параметры хранятся в другом столбце этой строки ,Сумма случайных чисел пуассонов по кадру данных

Вот пример данных (называемых «исследований» в коде ниже):

phase Sites enroll_rate rec_months stud_months enrolled m_enroll 
51  2  1 2.95920139 2.0000000 5.000000  6  0 
52  2 24 0.20784867 2.0000000 5.000000  10  0 
53  2  3 0.46501736 3.0000000 6.000000  2  0 
54  2  2 1.40480769 3.0000000 6.000000  7  0 
55  2  1 1.31299020 5.0000000 7.000000  3  0 
64  2 29 0.04373204 0.9712526 1.971253  2  0 

И вот код, который я использую для достижения этого:

for (j in 1:nrow(studies)) { 
    studies$m_enroll[j] <- sum(rpois(studies$Sites[j],studies$enroll_rate[j])) 
    } 

Это делает задание, но учитывая, что кадр данных составляет сотни строк, и я делаю это моделирование десятки тысяч раз, он довольно неэффективен.

Я чувствую, что есть способ сделать это, используя одну из применяемых функций, но мой опыт с ними ограничен. Есть идеи?

+0

Нет времени, как настоящий, чтобы узнать! :-). 'm_enroll <- mapply (function (x, y) sum (rpois (x, y)), Sites, enroll_rate)' #not проверено, но достаточно близко, чтобы начать работать –

+0

Спасибо Carl - отлично работает! – user1445246

ответ

2
studies <- studies[rep(1:6,3000),] 
system.time(for (j in 1:nrow(studies)){studies$m_enroll[j] <-  
       sum(rpois(studies$Sites[j],studies$enroll_rate[j]))}) 
    user system elapsed 
105.74 0.00 106.30 
system.time(test <- sapply(1:nrow(studies),function(x) 
        sum(rpois(studies$Sites[x],studies$enroll_rate[x])))) 
    user system elapsed 
    0.36 0.00 0.36 
+0

Nice - возможно, легче интерпретировать, чем мой псевдокод 'mapply' –

Смежные вопросы