【问题标题】:Extracting different statistics from the same iteration of a for loop in R从R中for循环的同一迭代中提取不同的统计信息
【发布时间】:2021-01-29 02:34:55
【问题描述】:

我想在两个变量之间创建一个数据框,这些变量链接到每次迭代的相同分布。

sim_df <- rep(NA, 1000)
for (i in 1:1000) { 

#randomly generated distribution
dist = sample(c(0:200), 10, replace = TRUE)
dist = as.data.frame(dist)

#calculated statistics
dist_mean = mean(a[,1])
dist_sd   = sd(a[,1])

#build data frame
df = data.frame(dist_mean, dist_sd)

#return
sim_df = df[i]
}

我不确定如何定义每一列以便提取它们。

【问题讨论】:

    标签: r dataframe loops for-loop


    【解决方案1】:

    创建一个函数,该函数在一次迭代中返回均值和 sd。

    return_mean_sd <- function() {
      dist = sample(c(0:200), 10, replace = TRUE)
      c(mean = mean(dist), sd = sd(dist))
    }
    

    您可以调用此函数n 次来创建数据框。

    set.seed(123)
    sim_df <- as.data.frame(t(replicate(100, return_mean_sd())))
    head(sim_df)
    
    #   mean   sd
    #1 105.0 70.3
    #2 119.7 44.3
    #3  91.6 56.1
    #4  91.5 58.7
    #5  99.1 55.2
    #6  90.0 52.1
    

    【讨论】:

      【解决方案2】:

      我认为这就是你想要做的:

      set.seed(2021) # for reproducibility, do not use in production
      sim_df <- replicate(1000, {
        dist = sample(c(0:200), 10, replace = TRUE)
        data.frame(dist_mean = mean(dist), dist_sd = sd(dist))
      }, simplify = FALSE)
      
      sim_df[1:3]
      # [[1]]
      #   dist_mean  dist_sd
      # 1     143.1 40.04012
      # [[2]]
      #   dist_mean  dist_sd
      # 1       119 55.65169
      # [[3]]
      #   dist_mean  dist_sd
      # 1       103 44.23674
      

      从这里开始,如果您希望所有这些都在一帧中,那么

      sim_df1 <- do.call(rbind, sim_df)
      nrow(sim_df1)
      # [1] 1000
      head(sim_df1)
      #   dist_mean  dist_sd
      # 1     143.1 40.04012
      # 2     119.0 55.65169
      # 3     103.0 44.23674
      # 4     103.2 57.00838
      # 5     124.3 50.74785
      # 6     112.9 56.98041
      

      【讨论】:

        【解决方案3】:

        更容易生成完整的实现流,将它们转换为矩阵,然后从行中生成统计数据:

        dist <- sample(c(0:200), 10 * 1000, replace = TRUE)
        dist <- matrix(dist, ncol = 10)
        means <- rowMeans(dist)
        sds <- apply(dist, 1, sd)
        df <- data.frame(means, sds)
        head(df)
          means      sds
        1  60.7 52.45750
        2 124.3 65.82646
        3 101.3 73.34856
        4 116.4 39.37907
        5  97.2 65.79227
        6  94.7 58.27530
        

        【讨论】:

          猜你喜欢
          • 2021-12-20
          • 2022-07-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多