【问题标题】:Is there any way to make a data frame using the last values of a repeated loop?有没有办法使用重复循环的最后一个值来制作数据框?
【发布时间】:2021-07-03 03:32:59
【问题描述】:

我想仅使用来自重复循环的最后计算值来制作数据框。 对于重复和示例功能,我正在使用此数据。 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

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

【问题讨论】:

  • 图片中没有数据。请阅读我们的教程以在 R 标签中发布:stackoverflow.com/a/5963610/6574038
  • 感谢您分享教程。给您带来的不便,我深表歉意。

标签: r dataframe loops repeat


【解决方案1】:

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

library(tidyverse)

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

以下函数与重复循环执行相同的操作,但将相关结果存储在 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 返回任意数量的样本:

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

【讨论】:

  • 非常感谢您回答我的问题。我不好意思这么说,但多年来一直是我的好奇心,你解决了它。你让我很开心。谢谢!
  • @LoveRsomuch 没关系!真的很高兴你发现它有用:)
  • 感谢您的好意。我能再问你一个问题吗?这个 R 函数真的很有趣,很有趣,它给了我另一个好奇心。如果您能看到这篇文章,我将不胜感激:stackoverflow.com/questions/68248184/…
  • @LoveRsomuch 确定 - 我已经发布了一个答案和评论。
猜你喜欢
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 2023-03-04
  • 2019-08-24
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
相关资源
最近更新 更多