我在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中的每个位置?连接在这里扮演什么角色?
提前致谢。
答案 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])
元素的向量。