R循环两个向量

时间:2013-12-06 16:54:45

标签: r loops statistics

我在R中创建了两个向量,使用统计分布来构建向量。

第一个是长度为1000的字符串上的位置向量。该向量有大约10个值,称为mu。

第二个向量是一个数字列表,每个数字代表上面提到的每个位置的要素数量。该向量称为N。

我需要做的是为每个位置(mu)的所有特征(N)生成随机分布

经过一番摆弄后,我发现此代码正常运行:

for (i in 1:length(mu)){
a <- rnorm(N[i],mu[i],20)
feature.location <- c(feature.location,a)
}

这产生了正确的输出 - 长度和(N)的数字列表,每个数字是与mu中的数据相关的位置图。

我发现只有当我使用concatenate将值转换为向量时,这才有效。

我的问题是;为什么这段代码有效? R如何知道循环和(N)次,但对于mu中的每个位置?连接在这里扮演什么角色?

提前致谢。

2 个答案:

答案 0 :(得分:0)

我猜你是从一系列地点采样,每个都是变量号。时间。 我猜你的数据看起来像这样:

set.seed(1) # make reproducible
N <- ceiling(10*runif(10)) 
mu <- sample(seq(1000), 10) 
> N;mu
 [1]  3  4  6 10  3  9 10  7  7  1
 [1] 206 177 686 383 767 496 714 985 377 771

现在,您要从长度为N(i)的rnorm中取样,使用平均值mu(i)sd=20,并将所有结果存储在矢量中。 不建议使用您正在使用的方法(增长向量),因为每次添加元素时它都会在内存中重新复制。 (参见Circle 2,虽然对于这样的小例子,它并不那么重要。) 首先,初始化存储向量:

f.l <- NULL
for (i in 1:length(mu)){
    a <- rnorm(n=N[i], mean=mu[i], sd=20)
    f.l <- c(f.l, a)
}

然后,每次a存储您的长度为N[i]的样本,c() 与现有的f.l结合起来,方法是将其添加到结束。

更有效的方法是

unlist(mapply(rnorm, N, mu, MoreArgs=list(sd=20)))

对循环进行矢量化。 Unlist用作mapply返回不同长度的向量列表。

答案 1 :(得分:0)

要尝试直接回答您的问题,c(...)不是“连接”,而是“结合”。也就是说,它将它的参数列表组合到一个向量中。所以c(1,2,3)是一个包含3个元素的向量。

此外,rnorm(n,mu,sigma)是一个函数,它返回从正态分布中采样的n个随机数的向量。所以在每次迭代时,i

a <- rnorm(N[i],mu[i],20)

创建一个向量a,其中包含从N[i]采样的Normal(mu[i],20)个随机数。然后

feature.location <- c(feature.location,a)

将该向量的元素添加到上一次迭代的向量中。所以最后,你有一个带有sum(N[i])元素的向量。