【问题标题】:R fill several empty matrices with loopR用循环填充几个空矩阵
【发布时间】:2016-12-02 10:29:01
【问题描述】:

我想用循环填充我创建的空矩阵:

首先我创建了我的空矩阵,它工作正常:

for(q in (15:30)){
 assign(paste0("P",q), matrix(, nrow = q, ncol = q+1))}

但是现在当我想用我的公式填充这些矩阵时,我得到了一个维度错误:

   for(c in (1:q+1)){
    for(i in (1:q)){assign(paste0("P",q)[i,c],
((((((q-c) + 1 -(q-c+1- i))/q)^.69)/(((((q-c) + 1 - (q-c+1-i))/q)^.69+(((1 - ((q-c) + 1 -(q-c+1-i))/q))^.69))^(1/.69))) - (((((q-c)-(q-c+1-i))/q)^.69)/(((((q-c) - (q-c+1-i))/q)^.69+(((1 - ((q-c)-(q-c+1-i))/q))^.69))^(1/.69)))))}}}

尽管如此,当我将此循环用于单个矩阵时,它可以工作,例如:

 t <- 20
 c <- 1
 i <- 1
 for(c in (1:t+1)){
  for(i in (1:t)){P20[i,c]<-( (((((t-c) + 1 -(t-c+1-i))/t)^.69)/
                                      (((((t-c) + 1 - (t-c+1-i))/t)^.69+(((1 - ((t-c) + 1 -(t-c+1-i))/t))^.69))^(1/.69))) - 
                                     (((((t-c)-(t-c+1-i))/t)^.69)/(((((t-c) - (t-c+1-i))/t)^.69+(((1 - ((t-c)-(t-c+1-i))/t))^.69))^(1/.69))))}}

这个公式是根据累积前景理论给出概率权重,如果有人感兴趣的话。

你们知道我怎样才能使它更优雅吗?我应该更好地编写用户定义的函数吗?

【问题讨论】:

  • 你确定要一个for 循环吗,不用
  • 我很乐意在没有循环的情况下这样做

标签: r loops matrix


【解决方案1】:

如果您对生成的矩阵与您分配给的名称相同的列表感到满意,则可以执行以下操作:

l = lapply(15:30, function(q){
  t = q
  matrix(apply(expand.grid(1:q,1:(q+1)),1,
        function(x){
          i = x[1]
          c = x[2]
          ( (((((t-c) + 1 -(t-c+1-i))/t)^.69)/
               (((((t-c) + 1 - (t-c+1-i))/t)^.69+(((1 - ((t-c) + 1 -(t-c+1-i))/t))^.69))^(1/.69))) - 
              (((((t-c)-(t-c+1-i))/t)^.69)/(((((t-c) - (t-c+1-i))/t)^.69+(((1 - ((t-c)-(t-c+1-i))/t))^.69))^(1/.69))))


        }),nrow = q, ncol = q+1, byrow = TRUE)
})
names(l) = paste0("P",15:30)

我使用了像t=qi=x[1]; c=x[2] 这样的位,这样我就可以复制粘贴你的概率公式。

我们在这里所做的是使用lapply 循环您问题中的给定行号,然后我们使用expand.grid 为结果向量中的所有单元格提供索引对。我们对指标应用一个函数,该函数给定行i,列c,根据您的公式计算概率。然后将这些值转换为矩阵,以使结果具有适当的结构。

您最终会得到一个矩阵列表l,其中包含名为“P15”、“P16”、...的组件。

【讨论】:

  • 感谢@jamieRowen 的帮助,尤其是您的详细解释。但是现在如果我想进一步使用矩阵,我必须取消列表“l”?
  • @Max,一点也不。如果你想访问一个单独的矩阵,你可以做l$P15。您还可以使用attach(l) 将所有列表值组件引入全局环境。在你决定这对你来说是否是个好主意之前,我建议你先阅读一下附加的危险。 unlist 会将你的矩阵堆叠成一个巨大的向量,我怀疑这不是你想要的。
  • 好的。所以我需要进一步修改我的矩阵。我应该把它保留在列表中然后修改它吗?
  • 如果您愿意,可以将其保留在列表中。矩阵是否在列表中与您可以用它做什么几乎没有关系。事实上,如果您要以与此处类似的方式修改每个矩阵,那么将它们全部保存在一个列表中可能是有益的,因为您可以再次使用 lapply
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-28
  • 1970-01-01
  • 2011-09-29
相关资源
最近更新 更多