将循环函数转换为应用函数

时间:2017-10-08 01:12:59

标签: r for-loop apply

在R中,对于学校项目,我试图将使用for循环的函数转换为使用apply函数的函数。

我的函数模拟泊松分布,其中人可以输入参数n,lambda和m。 m是模拟的数量。然后,它输出m泊松模拟的所有均值的均值,并输出2x2网格的箱形图,以便用户可以显示具有不同参数值的多个图。它发布在下面。

我努力弄清楚如何将其转换为使用apply函数的函数。由于apply需要一个矩阵,我需要已经为我的for循环函数中的某些参数值设置矩阵m.out。另外,我不确定使用apply的功能究竟是什么。我想取矩阵中每个值的均值。

感谢任何帮助。

Venom<-function(n,l,m){
  if(!is.numeric(c(n,l,m))){return("Error non-numeric value entered for at `enter code here`least one parameter")}
    m.out<-NULL
    for(i in 1:m){
      data1<-rpois(n,l)
      m.sim<-mean(data1)
      m.out<-rbind(m.out, m.sim)
    }
    finalmean<-mean(m.out)
    hist(m.out, main=paste("Poisson n=",n))
    return(c(finalmean, m.out))
}
par(mfrow=c(2,2))

1 个答案:

答案 0 :(得分:3)

以下是for循环的一些基本R和tidyverse替代方案。

set.seed(0)
n = 10
l = 5
m = 20

首先,这是你原来的循环。我将rbind替换为c,因为m.out被视为向量而非矩阵。

m.out <- NULL
for(i in 1:m){
  data1 <- rpois(n,l)
  m.sim <- mean(data1)
  m.out <- c(m.out, m.sim)
}
print(m.out)
#  [1] 6.1 5.1 4.9 5.0 5.3 4.4 4.8 5.8 4.7 5.2 5.5 4.6 5.2 5.2 4.4 4.5 5.1 5.7 6.0 4.7

基础R

正如您所提到的,apply采用矩阵。但是,sapply可以使用向量作为输入和输出。

sapply(seq_len(m), function(x) {
  mean(rpois(n, l))
})

另一个基本的R解决方案是使用replicate,它将重复m次表达式。 simplify = T将使其输出向量而不是列表。

replicate(
  m,
  mean(rpois(n, l)),
  simplify = T)

Tidyverse

rerunpurrr的{​​{1}}版本。它会生成一个列表,因此我们需要replicate结果。

unlist

另一种方法是使用library('tidyverse') rerun(m, mean(rpois(n, l))) %>% unlist ,它将向向量中的每个元素应用一个函数,并返回一个双精度向量。

map_dbl