【问题标题】:double for loop, store every single value, using R双 for 循环,存储每个值,使用 R
【发布时间】:2014-11-20 05:54:29
【问题描述】:

我想使用双循环来设置一个 6 列和 2^6=64 行的矩阵。对于每一行,我试图存储从 S1 到 S6 的每个值。然后找到它们的平均值。之后,对所有 64 行运行 out 循环。我可以用一种非常复杂的方式来做到这一点,如下所示。

w <- expand.grid(rep(list(0:1),6))
for(i in 1:dim(w)[1])
{
  S0<-20
  u <- 1.1
  d <- .92
  S1 <- S0*u^w[i,1]*d^(1-w[i,1])
  S2 <- S0*u^w[i,2]*d^(1-w[i,2])
  S3 <- S0*u^w[i,3]*d^(1-w[i,3])
  S4 <- S0*u^w[i,4]*d^(1-w[i,4])
  S5 <- S0*u^w[i,5]*d^(1-w[i,5])
  S6 <- S0*u^w[i,6]*d^(1-w[i,6])
  a <- c(S1,S2,S3,S4,S5,S6)
  mean <- (S0+S1+S2+S3+S4+S5+S6)/7
}

任何人都可以帮助我处理内部循环。我在想的是使用内部 for 循环,例如:

for(j in 1:dim(w)[2])  
{
  S <- S0*u^w[i,j]*d^(1-w[i,j])
  sum <- S0+S
  mean <- sum/7
}

这绝对是错误的,因为 S 只被下一个值替换并且只为终端存储。即使我的 S1 到 S6 用完了,我也没有存储它。如果这些值可以存储在矩阵中,那就太好了。谢谢!

【问题讨论】:

  • a&lt;-S0*u^w*d^(1-w) 你在找什么?在 R 中,操作是矢量化的。如果你想要每一行的意思,你可以试试rowMeans(a)

标签: r for-loop matrix


【解决方案1】:

您可以使用apply 非常轻松地在每一行上执行一个函数:

S0 <- 20
u <- 1.1
d <- .92

means <- apply(w, 1, function (x) {
  sum(S0,S0*u^x * d^(1-x))/7
})
means
# [1] 18.62857 19.14286 19.14286 19.65714 19.14286 19.65714 19.65714 20.17143 19.14286 19.65714 19.65714 20.17143
# [13] 19.65714 20.17143 20.17143 20.68571 19.14286 19.65714 19.65714 20.17143 19.65714 20.17143 20.17143 20.68571
# [25] 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000 19.14286 19.65714 19.65714 20.17143
# [37] 19.65714 20.17143 20.17143 20.68571 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000
# [49] 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000 20.17143 20.68571 20.68571 21.20000
# [61] 20.68571 21.20000 21.20000 21.71429

但是如果你想坚持循环,那么你需要指定一个对象来存储循环外的输出,然后在向量的各个位置分配值。同样正如@nicola 所提到的,鉴于 R 中的操作是矢量化的,您不需要第二个循环:

means <- vector(length=dim(w)[1])

for(i in 1:dim(w)[1]) {
    S <- S0*u^w[i,]*d^(1-w[i,])
    means2[i] <- (sum(S)+S0)/7
}
means2
# [1] 18.62857 19.14286 19.14286 19.65714 19.14286 19.65714 19.65714 20.17143 19.14286 19.65714 19.65714 20.17143
# [13] 19.65714 20.17143 20.17143 20.68571 19.14286 19.65714 19.65714 20.17143 19.65714 20.17143 20.17143 20.68571
# [25] 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000 19.14286 19.65714 19.65714 20.17143
# [37] 19.65714 20.17143 20.17143 20.68571 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000
# [49] 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000 20.17143 20.68571 20.68571 21.20000
# [61] 20.68571 21.20000 21.20000 21.71429

【讨论】:

    【解决方案2】:

    或者正如 @nicola 在 cmets 中建议的那样,这可以在没有任何循环的情况下完成

    a<- S0*u^w*d^(1-w)
    rowMeans(cbind(S0, a))
    #[1] 18.62857 19.14286 19.14286 19.65714 19.14286 19.65714 19.65714 20.17143
    #[9] 19.14286 19.65714 19.65714 20.17143 19.65714 20.17143 20.17143 20.68571
    #[17] 19.14286 19.65714 19.65714 20.17143 19.65714 20.17143 20.17143 20.68571
    #[25] 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000
    #[33] 19.14286 19.65714 19.65714 20.17143 19.65714 20.17143 20.17143 20.68571
    #[41] 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000
    #[49] 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000
    #[57] 20.17143 20.68571 20.68571 21.20000 20.68571 21.20000 21.20000 21.71429
    

    或者

    res <- (rowSums(a)+S0)/7 
    res
    # [1] 18.62857 19.14286 19.14286 19.65714 19.14286 19.65714 19.65714 20.17143
    # [9] 19.14286 19.65714 19.65714 20.17143 19.65714 20.17143 20.17143 20.68571
    # [17] 19.14286 19.65714 19.65714 20.17143 19.65714 20.17143 20.17143 20.68571
    # [25] 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000
    # [33] 19.14286 19.65714 19.65714 20.17143 19.65714 20.17143 20.17143 20.68571
    # [41] 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000
    # [49] 19.65714 20.17143 20.17143 20.68571 20.17143 20.68571 20.68571 21.20000
    # [57] 20.17143 20.68571 20.68571 21.20000 20.68571 21.20000 21.20000 21.71429
    

    数据

    w <- expand.grid(rep(list(0:1),6))
    S0 <- 20
    u <- 1.1
    d <- .92
    

    【讨论】:

      猜你喜欢
      • 2016-08-21
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      相关资源
      最近更新 更多