2015-07-07 4 views
1

Я видел много этого близко к этому, но ничто не решило проблему, с которой я столкнулся. Поэтому мой вопрос заключается в том, как вы относитесь к векторному значению внутри функции, такой как средняя функция, и как вы можете поместить векторное значение в заголовок. Недавно я переключился с SAS на R, поэтому я немного смутился.Использование функций внутри цикла for в R

###### parameters ##### 
nphase1=50 
nphase2=1000 
varcount=5 
meanshift= 0 
sigmashift= 1 


##### phase1 dataset/ control limits ##### 

for (i in 1:varcount) 
{ 
    assign (paste("x",i, sep=""), (rnorm(nphase1,0,1))) 
    mean_var[i]=mean(x[i]) 
    std_var[i]=sd(x[i]) 
    Upper_SPC_Limit_Method1_var[i]= mean_var[i] + (3 * std_var[i]) 
    Lower_SPC_Limit_Method1_var[i]= mean_var[i] - (3 * std_var[i]) 
    moving_range_var[i]= abs(diff(x[i])) 
    MR_mean[i]= mean(moving_range_var[i]) 
    Upper_SPC_Limit_Method2_var[i] =mean_var[i] + (3 * MR_mean[i]) 
    Lower_SPC_Limit_Method2_var[i] =mean_var[i] - (3 * MR_mean[i]) 
} 

Я уверен, что мне придется сделать что-то похожее на (присвоение (паста («х», я, Сентябрь = «») для маркировки человека индивидуальных пределов, но я не могу получить, что шаг, не имея возможности вычислить среднее значение каждой переменной внутри цикла for. Я пытаюсь создать 5 переменных, каждая из которых имеет 50 наблюдений (нормальный случайный уровень). Я хочу взять среднее значение & Sd каждой переменной в строить контрольные пределы с помощью этих чисел.

Спасибо за понимание!

+2

, что вы на самом деле пытаетесь достичь? Это не очень ясно из вопроса. Кроме того, R имеет несколько мощных альтернатив для циклов (например, применительно к семейству функций), которые могут представлять интерес. –

ответ

1

Я считаю, что приведенный ниже код выполняет то, что вы желаете. Я использую matrix(), with() и apply(), и настоятельно рекомендую прочитать их для этой работы.

Apply() Tutorial

With() Primer

###### parameters ##### 
nphase1=50 
nphase2=1000 
varcount=5 
meanshift= 0 
sigmashift= 1 


##### phase1 dataset/ control limits ##### 

x <- matrix(rnorm(nphase1*varcount, 0, 1), nrow = nphase1, ncol = varcount) 
mean_var <- apply(x, 2, mean) 
std_var <- apply(x, 2, sd) 
df_var <- data.frame(mean_var, std_var) 
Upper_SPC_Limit_Method1_var <- with(df_var, mean_var + 3 * std_var) 
Lower_SPC_Limit_Method1_var <- with(df_var, mean_var - 3 * std_var) 
moving_range_var <- apply(x, 2, function(z) abs(diff(z))) 
MR_mean <- apply(moving_range_var, 2, mean) 
Upper_SPC_Limit_Method2_var <- with(df_var, mean_var + 3 * MR_mean) 
Lower_SPC_Limit_Method2_var <- with(df_var, mean_var - 3 * std_var) 
+0

Спасибо! это выполнило то, что я пытался сделать. Мне нужно будет сделать еще несколько исследований о том, как использовать эти функции. Я очень привык делать макросы Do loops в SAS, поэтому, естественно, мой мозг предположил, что цикл for был близкой альтернативой. Хотя ive читал, что для циклов нахмурены тем, что они, как правило, занимают значительное количество времени для достижения конечного результата. –

+0

шумиха об исключении для циклов в R, безусловно, с достоинством, хотя, возможно, немного раздута. есть много случаев, когда петли for() приемлемы, и они, безусловно, полезный инструмент, когда вы строите свои навыки R. , так как мой ответ ответил на ваш вопрос, нажмите галочку, чтобы принять его в качестве ответа. таким образом другие будут знать, что решение работает –

1

Ваши переменные не названы x[1], x[2] и т. Д. Они будут x1, x2 и т. Д. Вероятно, вы должны создать список, если это то, что вы хотите сделать, т. Е. x[[i]] <- rnorm(nphase1, 0, 1), но ваш код неэффективен. Вы должны посмотреть на его векторизация, делая x матрицей и т. Д.

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