2016-07-12 7 views
1
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 - это разные длины выборки, которые я хочу взять. Я создал пустые векторы Final и second для хранения значений для моего цикла.Съемка образцов с переменной длиной

Я столкнулся с проблемами, когда Final возвращал в основном 0 значений, поэтому, подумав немного, я решил, что все нулевые значения удалены из second каждого цикла. Но это не помогло, после запуска этого кода я получаю:

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

Теперь я застрял. Потому что, когда я читаю свой код, кажется очень ясным: возьмите образец от 1: 1000 от числа единиц, соответствующих [i] ns, учитывая i-й цикл. Затем возьмите стандартное отклонение ненулевых значений вектора, содержащего образец, и сохраните его в другом векторе, Final.

+2

Типичная проблема с циклом 'for', который должен быть записан как' for (i in 1: length (ns)) '. – Psidom

ответ

2

Основной проблемой здесь является для цикла:

for(i in length(ns)) { 

Выражение length(ns) возвращает единственное число, которое является длина вектора ns, который является 7. Следовательно, цикл будет выполняться только один раз i=7.

Лучший способ петли вдоль вектора использовать seq_along():

for (i in seq_along(ns)) { 

отметить также, что выражение

rep(0,N) 

может быть заменен

double(N) 

поскольку элемент по умолчанию для нового двойного вектора равна нулю. Эта форма также более идиоматична, поскольку она выражает намерение построить новый вектор, который будет использоваться позже.

+0

Спасибо, а также Psidom. Приятно знать, что я был очень близок. И я буду помнить об этих двух функциях, они кажутся мне более важными. – Antecedent

Смежные вопросы