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