r - 为什么这个循环和附加到数据框不起作用?

标签 r loops

我已经做过很多次类似的操作,但这个例子让我感到困惑。为什么这不起作用?我的预期输出是每行平均值的平均值

library(dplyr)

for(i in 1:3) {
  avgs = data_frame('avgs' = rep(NA,3))
  avg = mean(rnorm(100, .6 , 6.8))
  avgs[i, ] = avg
}
avgs

最佳答案

修复您的代码:

library(dplyr)

avgs = data_frame('avgs' = rep(NA,3))
for(i in 1:3) {
  avg = mean(rnorm(100, .6 , 6.8))
  avgs$avgs[i] = avg
}
avgs

为什么要避免循环:

library(microbenchmark)

rows = 3
avgs = data_frame('avgs' = rep(NA,rows))

loop <- function(df) {
  for(i in 1:rows) {
    avg = mean(rnorm(100, .6 , 6.8))
    df$avgs[i] = avg
  }
  return(df)
}

vectorize_it <- function(df) {
  df$avgs <- replicate(rows,mean(rnorm(100, .6 , 6.8)))
  return(df)
}

microbenchmark::microbenchmark(loop(avgs),vectorize_it(avgs))

rows = 3e3
avgs = data_frame('avgs' = rep(NA,rows))

microbenchmark::microbenchmark(loop(avgs),vectorize_it(avgs))
Unit: microseconds
               expr     min       lq     mean   median      uq      max neval
         loop(avgs) 242.936 252.3650 392.8930 271.5235 326.749 4987.736   100
 vectorize_it(avgs) 138.131 142.1365 290.6037 155.3900 184.079 4804.938   100
> 
> rows = 3e3
> avgs = data_frame('avgs' = rep(NA,rows))
> 
> microbenchmark::microbenchmark(loop(avgs),vectorize_it(avgs))
Unit: milliseconds
               expr       min        lq      mean    median        uq      max neval
         loop(avgs) 281.02566 294.74691 345.14865 315.18423 347.36404 847.0420   100
 vectorize_it(avgs)  41.90678  43.51001  55.31815  47.26524  56.92735 167.4951   100

关于r - 为什么这个循环和附加到数据框不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70851936/

相关文章:

R包开发——指向函数调用的对象

删除具有完整 NA 集的行

c - 当在循环中突然退出 C 程序时,为什么会发生额外的循环迭代?

php - 从foreach循环php中将信息存储在数组中

r - 按特定值过滤行 %in% 一个或多个指定列

css - R Shiny 中的响应式 CSS 属性

java - 服务器端的R计算

c - For Loop 多次迭代失败

javascript for 循环顺序

loops - foreach 查找所有缺失值