【问题标题】:How to for-loop over a custom function R?如何对自定义函数R进行for循环?
【发布时间】:2020-12-04 15:26:32
【问题描述】:

我编写了这个函数,它返回值 1 在针对不同样本大小迭代 1000 次时未出现在随机样本中的概率。

bday.function <- function(sample.size){
  x <- vector()
  for (i in 1:1000){
  x[i] <- !any(data.frame(table(sample(1:365, sample.size, replace=TRUE)))$Var1 == 1)
}
  return(mean(x))
}

现在我想使用这个函数和另一个 for 循环来计算 500 到 1500 之间的每个样本大小的概率,并为我的结果制作一个简单的散点图。这是我尝试过的:

z <- vector()
for (i in 500:1500) {
  z[i] <- bday.function(i)
  return(plot(z))
}

编辑:当我运行 bday.function 时,输出是 TRUE 值的数量除以总 (1000) TRUE/FALSE 结果:

bday.function(750)
[1] 0.122

我想对 500 到 1500 之间的样本大小进行复制,以生成简单的散点图

编辑2:感谢大家的帮助!这是我的最终解决方案:

x <- vector(length = 1000)

for (i in 1:1000){
  x[i] <- !any(sample(1:365, 500, replace=TRUE) == 1) 
}

x
bday.function <- function(sample.size){
  x <- vector(length= 1000)
  for (i in 1:1000){
  x[i] <- !any(sample(1:365, sample.size, replace=TRUE) == 1) 
}
  return(mean(x))
}
bday.function(750)
z <- vector(length = 1000)
tmp.index <- 500:1500
for (i in seq_along(tmp.index)) {
  z[i] <- bday.function(tmp.index[i])
}
#Plot
plot(tmp.index, z, xlab = "sample size", ylab = "Probability of no birthdays")

【问题讨论】:

  • 我们没有数据来重现您的代码。可以发一下吗?
  • 数据由sample(1:365, sample.size, replace=TRUE)生成
  • 我从这段代码开始并从那里构建了函数:data.frame(table(sample(1:365, 500, replace=TRUE)))
  • 您能否更新您的原始帖子以显示在情节和数据结构方面的预期结果?
  • 完成!函数 "!any(data.frame(table(sample(1:365, sample.size, replace=TRUE)))$Var1 == 1)" 返回一个 TRUE/FALSE 值,这样当在 for 中迭代 1000 次时-loop 它返回 1000 个 TRUE/FALSE 值。这些值被强制转换为整数并计算平均值。

标签: r for-loop probability


【解决方案1】:

正如 @JohnColeman 在他睿智的评论中指出的那样,您的功能可能会很慢。尝试对您的代码进行这些更改以进行打印输出。我只运行了 60 次模拟人生,因为我需要完成其他事情:

#Function
bday.function <- function(sample.size){
  x <- vector()
  for (i in 1:1000){
    x[i] <- !any(data.frame(table(sample(1:365, sample.size, replace=TRUE)))$Var1 == 1)
  }
  return(mean(x))
}
#Loop
z <- vector()
vec <- 500:1500
for (i in seq_along(vec)) {
  z[i] <- bday.function(vec[i])
}
#Plot
plot(z)

输出:

【讨论】:

  • 你能解释一下vec和seq_along的使用吗?这明显加快了我的代码速度,但对文档的扫描并没有向我揭示为什么这会起作用。感谢您的帮助!
  • @myfatson 当然,seq_along() 创建一个从 1 到您放置在函数内的对象长度的序列。而vec 只是一个向量,也许这里的关键是: 的使用,它可以帮助你创建一个像1:5 这样的序列将创建1,2,3,4,5。希望这对你来说很清楚:)
【解决方案2】:

你在寻找这样的东西吗?

bday.function <- function(sample.size) {
  
  mean(sapply(seq(1000), function(x)
    +!any(sample(365, sample.size, replace = TRUE) == 1)))
}

x <- 500:1500
y <- sapply(x, bday.function)
plot(x, y, xlab = "sample size", ylab = "Probability of no birthdays")

【讨论】:

  • 这绝对是我想要的!不幸的是,我正在为在 base R 中指定 for 循环的作业执行此操作。尽管知道使用 sapply 会更容易,但我正在尝试练习我的 base R 以完善我的知识。
猜你喜欢
  • 2019-08-08
  • 2018-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多