在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))
答案 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
正如您所提到的,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)
rerun
是purrr
的{{1}}版本。它会生成一个列表,因此我们需要replicate
结果。
unlist
另一种方法是使用library('tidyverse')
rerun(m, mean(rpois(n, l))) %>%
unlist
,它将向向量中的每个元素应用一个函数,并返回一个双精度向量。
map_dbl