【问题标题】:For loop: save results of function in separate vector for each iFor 循环:将函数的结果保存在每个 i 的单独向量中
【发布时间】:2017-06-28 00:51:46
【问题描述】:

我有一个包含两列的数据框。一个代表平均值,一个代表标准。偏差。 我想运行一个 for 循环并确保结果的安全

rnorm(1000,dataframe[i,1],dataframe[i,2])

在名称中与 i 关联的向量中。

喜欢:vector_i、vector_i+1、vector_i+2.....

有什么想法吗?

【问题讨论】:

  • 哪种语言? R?
  • 抱歉忘了说。是的,它的 R
  • 是的。最好的办法是不要做你想做的事。将结果放在列表中。
  • 为什么不将结果保存到列表中?
  • matrix(rnorm(1000 * nrow(DF), DF[, 1], DF[, 2]), nrow = 1000, byrow = TRUE) 未测试,因为在我的手机上。

标签: r for-loop


【解决方案1】:

如果你想要一个矩阵,像这样的东西?

fun <- function`(mat,nb=1000)
{
     tt<- apply(mat, 1, function(x)
     {
         n<-rnorm(nb,x[,1],x[,2])
        return(n)
     })
 return(tt)
}
fun(mat) 

【讨论】:

    【解决方案2】:

    您可以使用mapply 来做到这一点,这是一个*apply 函数,它为提供的函数接受多个参数,并将相应位置的值应用于它们的参数。在这种情况下,它将返回一个矩阵,其中列是rnorm 样本。

    这是一个简单的例子

    #set seed for reproducibility
    set.seed(1234)
    
    myNorms <- mapply(function(x, mean, sd) rnorm(x, mean, sd), 500, 0:2, c(1, 1, 5))
    head(myNorms, 5)
               [,1]       [,2]      [,3]
    [1,] -1.2070657  1.9847800 -4.026667
    [2,]  0.2774292 -0.2247379  3.507334
    [3,]  1.0844412  1.7097262 -5.695726
    [4,] -2.3456977  0.8907800  5.176854
    [5,]  0.4291247  2.7826079  5.514759
    

    这将从每个分布中抽取 500 个元素。 {mean 0, sd 1}, {mean 1, sd 1} 和 {mean 2, sd 5} 的法线。

    我们可以检查手段

    colMeans(myNorms)
    [1] 0.001838821 0.944966777 2.158396474
    

    标准差

    apply(myNorms, 2, sd)
    [1] 1.0348139 0.9585917 4.6880564
    

    您可以用 data.frame 中的向量替换最后两个参数。


    根据 roland 在 OP 中的评论,可以单独使用 rnorm 而不使用 mapplyas r* 函数系列将采用向量参数作为均值(和 sd 在适当的情况下)参数。但它的用法可能与预期略有不同。对于上面的mapply 示例,函数将是

    set.seed(1234)
    myNorms <- matrix(rnorm(500L * 3L,
                            mean=rep(0:2, each=500L), sd=rep(c(1, 1, 5), each=500L)),
                      500)
    

    因此,每次随机抽取都必须重复所需分布的均值和标准差。

    检查,我们得到与上面相同的方法:

    colMeans(myNorms)
    [1] 0.001838821 0.944966777 2.158396474
    

    【讨论】:

      猜你喜欢
      • 2019-11-23
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多