2014-10-29 3 views
-1

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

У меня есть кадр данных, который я хочу применить функцию rdirichlet (от gtools) к каждой строке. Итак, каждая строка должна рассматриваться как aplha.

data = NULL 
data <- data.frame(rbind(
oct = c(60, 32, 8), 
sep = c(53, 35, 12), 
ago = c(54, 40, 6) 
)) 
data <- data/100*1000 

library(gtools) # contains the function 


sim <- 10000 # simulation 

Моя первая attenpt было использовать apply, он работает, но выход не то, что ясно для проведения дальнейшего анализа; каждое вычисление строки становится вектором:

p = apply(data, 1, function(x) rdirichlet(sim, alpha = x + 1)) 

Я также попробовать в цикле без успеха:

p = NULL 
for(i in 1:length(data)) { 
p[i] <- rdirichlet(sim, alpha = data[i] + 1) 
} 

Любого наконечника, как я могу решить эту проблему?

+0

Может 'lapply (данные, rdirichlet, п = сим)' – jbaums

+0

@jbaums, я предполагаю, что вы имеете в виду что-то вроде 'sapply (т (данные) , rdirichlet, n = sim) ', хотя в нем отсутствует элемент' x + 1' –

+0

@David - ну, что зависит от того, что такое «строка». (И я понятия не имею, что релевантность «x + 1» ... это не описано в Q). – jbaums

ответ

1

Две важные вещи здесь. Во-первых, векторизации это лучший способ пойти:

ans <- apply(data, 1, function(x) rdirichlet(sim, alpha = x + 1)) 

Делая это, вы будете получать каждый ряд вычислений, как вектор, по существу K против сим нравится.

Тогда вам нужно субсемплировать такие вещи, как:

margin <- ans[1:100000,1] - ans[100001:200000,1] 
+1

Использование 'apply' is not vectorizing. Не говоря уже о том, что этот ответ уже был опубликован, и, говоря об OP, он также пытался использовать его –

2

Ну во-первыхи, вы можете захотеть изменить data в вашей анонимной функции в apply для x, чтобы соответствовать x в function(x)

apply(data, 1, function(x) rdirichlet(sim, alpha = x + 1)) 

Это работает для меня, так как в нем обеспечивает выход с тремя столбцами и 30000 строк.

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