我试图重复计算随机向量的中位数,构建所有中位数的向量。为什么我从下面的代码中得到NULL
结果,我在其中重复计算中位数并将其添加到向量m
的末尾?
medainfunc<-function(n,mu,sigma,iterate){
m<-c()
for (i in itreate){
x<-rnorm(n,mu,sigma)
y<-median(x)
m<-c(m,y)
}
m
}
medianfunc(10,3,15,10000)
NULL
答案 0 :(得分:3)
我们在OP代码中有多个拼写错误,即iterate
与itreate
并且在原始函数为medainfunc
时调用medianfunc
。另外,我们只为“迭代”提供单个输入值,因此我们可能希望在函数内部使用seq(iterate
。否则,我们得到一个单值输出。
medianfunc<-function(n,mu,sigma,iterate){
m<-c()
for (i in seq(iterate)){
x<-rnorm(n,mu,sigma)
y<-median(x)
m<-c(m,y)
}
m
}
set.seed(25)
medianfunc(10,3,15, 5)
#[1] 0.9770646 -6.4852741 4.6768291 -6.4167869 5.3176253
这可以通过获得rnorm
的&#39; n *迭代&#39;来进行矢量化。值。将其转换为matrix
并使用colMedians
中的library(matrixStats)
。
medianfunc1 <- function(n, mu, sigma, iterate){
m1 <- matrix(rnorm(n*iterate, mu, sigma), ncol=iterate)
library(matrixStats)
colMedians(m1)
}
set.seed(25)
medianfunc1(10,3,15, 5)
#[1] 0.9770646 -6.4852741 4.6768291 -6.4167869 5.3176253
答案 1 :(得分:2)
逐个构建向量既低效(参见the R inferno的第二个圆圈)又是代码密集型的。相反,您可以使用replicate
函数在一行代码中重复一次随机操作:
medianfunc <- function(n, mu, sigma, iterate) {
replicate(iterate, median(rnorm(n, mu, sigma)))
}
set.seed(25)
medianfunc(10,3,15, 5)
# [1] 0.9770646 -6.4852741 4.6768291 -6.4167869 5.3176253
答案 2 :(得分:0)
我不知道这只是你在帖子上写的代码,但函数被称为medainfunc
,然后在你的代码上调用medianfunc
。这可能只是一个错误,我注意到的另一件事是你应该添加return
在你的功能结束时如此:
medainfunc<-function(n,mu,sigma,iterate){
m<-c()
for (i in itreate){
x<-rnorm(n,mu,sigma)
y<-median(x)
m<-c(m,y)
}
return(m)
}