【问题标题】:Taking samples with variable length以可变长度采样
【发布时间】:2016-07-12 16:42:02
【问题描述】:
ns<-c(1,5,20,50,100,1000,10000)
Final<-rep(0,7)
second<-rep(0,10000)
for(i in length(ns)) {
second<-sample(1:1000,ns[i],replace=TRUE)
second[second==0]<-NA
Final[i]<- sd(second,na.rm=FALSE)
}

ns 是我想要采用的不同采样长度。我创建了空向量 Finalsecond 来存储循环的值。

我遇到了 Final 大部分返回 0 值的问题,所以经过思考后,我决定在每个循环中从 second 中删除所有零值。但这并没有帮助,运行此代码后,我得到:

> Final
[1]   0.000   0.000   0.000   0.000   0.000   0.000 288.569

现在我被困住了。因为当我阅读我的代码时,似乎很清楚:在给定第 i 个循环的情况下,从与ns 的 [i] 对应的单元数的 1:1000 中抽取样本。然后取包含样本的向量的非零值的标准差,并将其存储在另一个向量中,Final

【问题讨论】:

  • for 循环的典型问题,应写为for(i in 1:length(ns))

标签: r loops random


【解决方案1】:

这里的主要问题是for循环:

for(i in length(ns)) {

表达式length(ns)返回一个数字,即向量ns的长度,即7。因此循环只会执行一次i=7

沿向量循环的最佳方法是使用seq_along()

for (i in seq_along(ns)) {

还要注意表达式

rep(0,N)

可以替换为

double(N)

因为新双精度向量的默认元素值为零。这种形式也更惯用,因为它表达了构造一个新向量以供以后使用的意图。

【讨论】:

  • 谢谢 - 以及 Psidom。很高兴知道我非常接近。我会记住这两个函数,它们对我来说似乎更重要。
猜你喜欢
  • 1970-01-01
  • 2019-12-30
  • 2019-05-31
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多