首页 > 解决方案 > 如何在 R 中使用 for 循环来创建累积计数器向量?

问题描述

我有这个代码:

N=5

RowNum <-c(1:N)
Prob <- c(0.5,0.3,0.8,0.2,0.9)
Attempts <- c(rep(0,N))
Succeeded <- c(rep(0,N))

Overall <- data.frame(RowNum,Prob,Attempts,Succeeded) 

set.seed(1)

addone <- function(vec) {
  
  vec$Attempts <- vec$Attempts + 1
  if(runif(1) < vec$Prob) {
    vec$Succeeded <- vec$Succeeded + 1
  } else {
    vec <- addone(vec)
  }
  vec
}

make.new.df <- function(df) {
  for(i in 1:nrow(df)) {
    df[i, ] <- addone(df[i, ])
  }
  df
}
  
  
  df1 <- make.new.df(Overall)

df1

这是使用 set.seed(1) 的输出

  RowNum Prob Attempts Succeeded
1      1  0.5        1         1
2      2  0.3        4         1
3      3  0.8        3         1
4      4  0.2        2         1
5      5  0.9        1         1

我想创建一个循环,通过插入一个 N 然后这段代码将运行 N 次。例如 - 让我们设置 N=100,输出应该如下所示(使用 set.seed(1)):

  RowNum Prob Attempts Succeeded
1      1  0.5        100         100
2      2  0.3        400         100
3      3  0.8        300         100
4      4  0.2        200         100
5      5  0.9        100         100

我会感谢你的帮助!

标签: r

解决方案


我不会使用递归函数,因为如果你N变大,它可能会产生问题。使用while循环你可以尝试:

make.new.df <- function(df, success_n) {
  for(i in seq_len(nrow(df))) {
    count <- 0
    prob <- df$Prob[i]
    success <- df$Succeeded[i]
    while (success < success_n) {
      if(runif(1) < prob) success <- success + 1
      count <- count + 1
    }
    df$Succeeded[i] <- success
    df$Attempts[i] <- count
  }
  return(df)
}

df1 <- make.new.df(Overall, 10)
df1
#  RowNum Prob Attempts Succeeded
#1      1  0.5       22        10
#2      2  0.3       37        10
#3      3  0.8       11        10
#4      4  0.2       20        10
#5      5  0.9       11        10

df1 <- make.new.df(Overall, 100)
df1
#  RowNum Prob Attempts Succeeded
#1      1  0.5      183       100
#2      2  0.3      379       100
#3      3  0.8      127       100
#4      4  0.2      423       100
#5      5  0.9      111       100

推荐阅读