【问题标题】:How to repeat a for loop in R for n times?如何在 R 中重复一个 for 循环 n 次?
【发布时间】:2021-01-25 15:42:39
【问题描述】:

我试图在 R 中重复一个 for 循环固定次数。这是我要重复的代码示例

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次即可。

【问题讨论】:

  • @akrun 使用复制不能完成这项工作。问题是我试图在数据集中填充一个变量,以便最终结果是具有新值的数据集。复制命令不这样做。
  • @akrun 我无法生成提供相同输出的可重现示例。在我的数据集中,每次运行时输出都会不断变化,这就是我想运行几次的原因。
  • 在您的代码中,data$deltas[i] 的值取决于data$deltas[i+1],这是不可能的。 (除非deltas 已经存在...).. 但这可能是每次运行时值都会发生变化的原因。
  • 只是在这里猜测...您的数据是 130 行吗?这就是为什么里面有 if 条件吗?
  • 如果是这样,您的循环可以简化为:library(dplyr);mutate(data, deltas = (p - lead(p, default=0)) * alphas + lead(deltas, default=0))

标签: r for-loop


【解决方案1】:

如果我们想重复 for 循环“n”次,请使用 for 循环创建一个 function

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

【讨论】:

  • 感谢您的帮助,但不幸的是它不起作用,仅将数据帧作为空白数组返回。
  • 是的,实际上它与您在此处编辑的代码完全相同
  • @confuseddoughnut 我把循环从1:(nrow(data)-1) 改成了i + 1
  • 这并不重要,因为 if 语句为数据集中的最后一行赋值,然后 else 循环从那里开始。它仍然返回一个空数组。谢谢你,但我想我卡住了
  • @confuseddoughnut 好的,这只是 return 声明。它现在应该可以工作了
猜你喜欢
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多