有什么方法可以使用重复循环的最后一个值来制作数据框吗?

Is there any way to make a data frame using the last values of a repeated loop?

我想仅使用 Repeat 循环中的最后计算值来制作数据框。 对于 repeat 和 sample 函数,我使用的是这些数据。 Prob 列中的数字是每个数字出现的概率。 enter image description here

b <- 1
repeat {
  c <- sample(a$Plus, size=1, prob=(a$Prob))
  cat(b, '\t', c, '\n')
  b <- b + 1
  if (c >= 10) {
    {
      break
    }
  }
}
#I'm interested in the result greater than 10 only

如果我运行上面的代码,那么它会计算类似

的东西
1    4 
2    8
3    13 

如果我再次运行这个,它会计算出不同的结果,比如..

1    9 
2    3
3    7
4    3
5    11

我想做的是仅使用每个循环的最后输出来制作数据框。 例如,使用上面的计算数据,我想制作一个看起来像

的框架
Trial Result
3 13
5 11

有什么方法可以按我想要的次数重复这个循环,并只使用每个重复函数的最后输出来制作数据框吗?

您可以使用用户定义的函数来执行此操作。由于您还没有提供数据框 a,我将其定义如下:

library(tidyverse)

a <- tibble(
  Plus = 1:15,
  Prob = seq(from = 15, to = 1, by = -1)
)

以下函数与您的 repeat 循环执行相同的操作,但将相关结果存储在 tibble 中。我已将您的变量 b 排除在外,因为据我所知,它对您想要的输出没有帮助。

samplefun <- function(a) {
  c <- sample(a$Plus, size=length(a$Plus), prob=a$Prob)
  
  res <- tibble(
    Trial = which(c >= 10)[1],
    Result = c[which(c >= 10)[1]]
  )
  
  return(res)
}

然后使用 map_dfr 到 return 任意数量的样本:

nsamples <- 5
map_dfr(1:nsamples, ~ samplefun(a))

输出:

# A tibble: 5 x 2
  Trial Result
  <int>  <int>
1     4     11
2     6     14
3     5     11
4     2     10
5     4     15