【问题标题】:Warning: number of items to replace is not a multiple of replacement length警告:要替换的项目数不是替换长度的倍数
【发布时间】:2020-02-02 04:52:25
【问题描述】:

我不明白我的代码循环运行有什么问题。请帮忙

P10<-numeric(2000) 
for(i in 1:2000){
  r <- rnorm(10, 0.03, 0.005)
  P10[i] <- 20 * exp(cumsum(r))
}

Warning in P10[i] <- 20 * exp(cumsum(r)): number of items to replace is not
## a multiple of replacement length

【问题讨论】:

  • 不确定您期望的输出应该是什么样子。例如,如果将 P10[i] 重命名为 P,则脚本运行时不会出现警告。
  • 嗨 wolsx,如果您能提供具有预期输出的最小示例,这将有所帮助,请参阅 stackoverflow.com/questions/5963269/…
  • 不清楚你想在这里做什么。发生警告是因为您试图将 exp(cumsum(r)) 创建的 10 个项目的列表分配到单个条目中。
  • 这是解决此问题时的建议。我假设您希望 P10[i] 包含一个数字。手动运行:i &lt;- 1; r &lt;- rnorm(10, 0.03, 0.005),现在看看r,它应该是一个数字向量(长度为 10)。现在运行20 * exp(cumsum(r)),它仍然是一个数字向量(长度为10),已转换。现在回想一下您对P10[i] 的期望,它应该是一个数字。您需要对 10 个数字的向量进行什么处理?
  • 我想通了!谢谢大家

标签: r


【解决方案1】:

你可能想做这样的事情:

P10 <- lapply(1:2000, function(x) {
  r <- rnorm(10, 0.03, 0.005)
  20 * exp(cumsum(r))
})

P10 <- unlist(P10)

这很相似,但会得到一个 10 * 2000 的矩阵

P10 <- replicate(2000, {
  r <- rnorm(10, 0.03, 0.005)
  20 * exp(cumsum(r))
})

【讨论】:

  • 甚至更快20 * exp(apply(matrix(rnorm(10*2000), nr=10), 2, cumsum))。 (使用较大的随机拉动应该更快,因为它只进行一次随机拉动而不是 2000 次小随机拉动。)(仅供参考:我将其显示为 10*2000 是为了声明性地生成足够的矩阵。 10 应该清楚地 (?) 与 10*nr=10 中的数字相同。)
猜你喜欢
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-08
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多