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



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

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

最新更新