R用循环填充几个空矩阵

时间:2016-12-02 10:29:01

标签: r loops matrix

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

首先,我创建了空的matrizes,工作正常:

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))))}}

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

你们是否知道如何让这更优雅?我应该更好地编写用户定义的函数吗?

1 个答案:

答案 0 :(得分: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”的组件......