如何存储我在R中创建的值

时间:2014-09-11 21:51:49

标签: r

如何在R中存储值?我想要生成K的四个值并将其存储在m[1]中,因此我有m[1,1]m[1,2]m[1,3]m[1,4]。然后生成K的第二组四个值并存储在m[2]中,以便m[2,1]m[2,2]m[2,3]m[2,4]。我尝试了这个程序,但收到此错误消息:

1: In m[j] = Cp[1:4] :
  number of items to replace is not a multiple of replacement length
2: In m[j] = Cp[1:4] :
  number of items to replace is not a multiple of replacement length

k=numeric()
k[1]=0
for (j in 1:2) {
  for (count in 1:3) {
    k[count+1]=k[count]+rnorm(1,0,1)
  }
  m[j]=k[1:4]
}

2 个答案:

答案 0 :(得分:1)

您的行是正态分布的样本的累积总和;你可以通过以下方式得到这个:

set.seed(144)
t(sapply(1:2, function(row) c(0, cumsum(rnorm(3, 0, 1)))))
#      [,1]      [,2]      [,3]      [,4]
# [1,]    0 -1.650556 -1.047746 -1.521630
# [2,]    0 -1.797613 -3.218734 -3.059847

答案 1 :(得分:1)

虽然josilber的答案很好地放在R-speak中(我建议使用它),但要理解为什么你的代码无法正常使用以下内容。

m在循环之前的任何地方都没有定义,但假设它被定义为数字(),就像k一样,这意味着它是一个向量。

您拨打电话

m[j]<-k[1:4]  

当使用单个括号对矢量进行子集时,在您的示例中,它实质上将返回m [j](这是一个数字),并尝试将其替换为k [1:4](这是4个数字! )。

这并没有多大意义,所以R抱怨它。唯一可行的方法是,如果你试图用4个数字替换4个数字(事物必须与单个括号相同,或者实际上是彼此的倍数,但这涉及回收和我们可能不想进入这里)

您可以做的是将m定义为列表(m&lt; -list())然后您将调用更改为

m[[j]]<-k[1:4]

在R中,列表不关心单个元素的大小,每个插槽都是自己的桶。要访问存储桶,请使用双括号而不是单个。列表列表也有效!因此,如果您要使用列表列表,您将能够在您的问题中获得所需的二维方面,其中每个内部存储桶m [[i,j]]将等于关联的k [1 :4]