【问题标题】:R looping over two vectorsR循环两个向量
【发布时间】:2013-12-06 16:54:45
【问题描述】:

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

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

我发现这只有在我使用连接将值放入向量时才有效。

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

提前致谢。

【问题讨论】:

    标签: r loops statistics


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 当然,我明白了;简而言之,它之所以有效,是因为它是 rnorm 函数的一个属性。 combine 参数只是确保在循环重新开始之前将每轮迭代的结果存储在某处。非常感谢!
    【解决方案2】:

    我猜你是从一系列位置采样,每个位置都有一个变量号。次。 我猜你的数据看起来像这样:

    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 返回一个不同长度的向量列表。

    【讨论】:

    • 很好的建议,谢谢,尤其是矢量化示例。矢量化是我想要掌握的一件事,因为它使代码更加优雅和高效。
    猜你喜欢
    • 2018-04-05
    • 2016-08-10
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2021-04-18
    • 2021-12-01
    相关资源
    最近更新 更多