2014-10-29 57 views
-1

我知道本網站提出了類似的問題here,herehere,但它們都沒有解決我的問題。如何在數據框中爲每一行應用分佈函數

我有一個數據框,我想將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,N = SIM)' – jbaums 2014-10-29 13:54:04

+0

@jbaums,我猜你的意思是像'sapply(T(數據) ,rdirichlet,n = sim)'雖然它缺少'x + 1'部分 – 2014-10-29 13:57:28

+0

@David - 這取決於「行」是什麼。 (我不知道'x + 1'的相關性是什麼......它在Q中沒有描述) – jbaums 2014-10-29 13:59:52

回答

1

這裏有兩件重要的事情。首先,矢量化是最好的方式去:

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

通過這樣做,你會收到每行計算爲矢量,本質上是k vs模擬像。

那麼你就需要進行二次採樣之類的東西:

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

使用'apply' isnt矢量化。更何況這個答案已經發布,並提及OP也試圖使用它 – 2014-10-30 05:30:16

2

那麼首先你可能想在apply改變data在匿名函數來x匹配xfunction(x)

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

這個工作對我來說,因爲它提供了三列的輸出和30000行。

相關問題