Как повторить цикл for в R n раз?

#r #for-loop

#r #for-цикл

Вопрос:

Я пытаюсь повторить цикл for в R фиксированное количество раз. Вот пример кода, который я хочу повторить

 for (i in 1:nrow(data)) {
  if (i>130){
    data$deltas[i]=-((-data$p[i]))*data$alphas[i]
  }
  else  {
    data$deltas[i]=
      ((-(((data$p[i 1])-(data$p[i])))*data$alphas[i])   data$deltas[i 1])
  }
}
  

У меня нет никаких условий, которые необходимо выполнить, просто нужно запустить один и тот же код над одним и тем же набором данных n раз.

Комментарии:

1. @akrun использование replicate не выполняет эту работу. Дело в том, что я пытаюсь заполнить переменную в наборе данных, чтобы конечным результатом был набор данных с новыми значениями. Команда replicate этого не делает.

2. @akrun Я не могу сгенерировать воспроизводимый пример, который дает тот же результат. В моем наборе данных результат продолжает меняться каждый раз, когда я его запускаю, поэтому я хотел запустить его несколько раз.

3. в вашем коде значение data$deltas[i] зависит от data$deltas[i 1] , что невозможно. (если deltas он еще не существует …) .. но, вероятно, именно поэтому значение меняется каждый раз, когда вы его запускаете.

4. просто угадайте здесь … ваши данные 130 строк? поэтому внутри есть условие if?

5. если это так, ваш цикл можно упростить до: library(dplyr);mutate(data, deltas = (p - lead(p, default=0)) * alphas lead(deltas, default=0))

Ответ №1:

Если мы хотим повторить for цикл ‘n’ раз, создайте a function с for помощью цикла

 f1 <- function(data, ival) {  
       
      for(i in head(seq_len(nrow(data)), -1)) {
        if(i > ival) {
         data$deltas[i] <- -((-data$p[i])) * data$alphas[i]
        
        } else  {
         data$deltas[i] <- ((-(((data$p[i 1]) - (data$p[i]))) * 
                            data$alphas[i])   data$deltas[i 1])
        }
      
      }
    return(data)

  }
  

и назначать данные на каждой итерации

 n <- 10
for(i in seq_len(n)) data <- f1(data, ival = 130)
  

Используя небольшой воспроизводимый пример

 set.seed(24)
df1 <- data.frame(deltas = rnorm(10), p = runif(10), alphas = rnorm(10))
  

-ввод

 df1
#         deltas          p      alphas
#1  -0.545880758 0.09393471 -0.46906069
#2   0.536585304 0.55225375 -0.33498679
#3   0.419623149 0.72516981  1.53625216
#4  -0.583627199 0.13792462  0.60999453
#5   0.847460017 0.22296603  0.51633570
#6   0.266021979 0.68767062 -0.07430856
#7   0.444585270 0.07648914 -0.60515695
#8  -0.466495124 0.59973018 -1.70964518
#9  -0.848370044 0.63014766 -0.26869311
#10  0.002311942 0.04663503 -0.64859151



n <- 10
for(i in seq_len(n)) df1 <- f1(df1, ival = 5)
  

-вывод

 df1
#         deltas          p      alphas
#1   0.832142549 0.09393471 -0.46906069
#2   0.617163102 0.55225375 -0.33498679
#3   0.559238507 0.72516981  1.53625216
#4  -0.342918176 0.13792462  0.60999453
#5  -0.291043381 0.22296603  0.51633570
#6  -0.051099814 0.68767062 -0.07430856
#7  -0.046287932 0.07648914 -0.60515695
#8  -1.025325821 0.59973018 -1.70964518
#9  -0.169316331 0.63014766 -0.26869311
#10  0.002311942 0.04663503 -0.64859151
  

Комментарии:

1. спасибо за вашу помощь, но, к сожалению, это не работает и возвращает фрейм данных только в виде пустого массива.

2. да, фактически это тот же самый код, который вы отредактировали здесь

3. @confuseddoughnut я изменил цикл, 1:(nrow(data)-1) потому что вы делаете i 1

4. на самом деле это не имеет значения, потому что оператор if присваивает значение последней строке в наборе данных, а затем оттуда запускается цикл else. он по-прежнему возвращает пустой массив. спасибо, но, думаю, я застрял

5. @confuseddoughnut хорошо, это просто return утверждение. Теперь это должно сработать