如何为数据框中的每一行应用分布函数

时间:2014-10-29 13:44:30

标签: r

我知道在此网站hereherehere中提出了类似的问题,但这些问题都没有解决我的问题。

我有一个数据框,我想将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

我的第一个注意事项是使用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)
}

任何提示如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

首先,您可能希望将data中的匿名函数中的apply更改为x以匹配x中的function(x)

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

这对我有用,因为它提供了一个包含三列和30000行的输出。

答案 1 :(得分:1)

这里有两个重要的事情。首先,矢量化是最好的方法:

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

通过这样做,你将每行计算作为向量接收,基本上是k vs sim like。

然后你需要对以下内容进行子样本处理:

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