You can do this without any loops. Here's an example with fake data and a smaller number of simulations, just for illustration:
library(tidyverse)
data = data.frame(Name=1:3, mean_proj=c(0, 100, 1000), proj_std=c(5,10,15))
n_sims = 5
sim_result = data %>%
group_by(Name) %>%
mutate(sim.vals = list(qnorm(runif(n_sims), mean_proj, proj_std)))
(Just curious: Is there some reason you wanted to do qnorm(runif(n_sims), mean_proj, proj_std) instead of rnorm(n_sims, mean_proj, proj_std)?)
You now have a data frame where the sim.vals column contains the simulation values (nested inside lists) for each row of data.
sim_result
Name mean_proj proj_std sim.vals
<int> <dbl> <dbl> <list>
1 1 0 5 <dbl [5]>
2 2 100 10 <dbl [5]>
3 3 1000 15 <dbl [5]>
You can see all of the sim.vals by unnesting:
sim_result %>% unnest(sim.vals)
Name mean_proj proj_std sim.vals
<int> <dbl> <dbl> <dbl>
1 1 0 5 -2.70
2 1 0 5 3.14
3 1 0 5 8.81
4 1 0 5 5.90
5 1 0 5 2.59
6 2 100 10 105.
7 2 100 10 97.7
8 2 100 10 112.
9 2 100 10 103.
10 2 100 10 97.3
11 3 1000 15 987.
12 3 1000 15 983.
13 3 1000 15 997.
14 3 1000 15 1014.
15 3 1000 15 999.
You can work with the data frame in various ways. For example:
sim_result %>%
mutate(mean.sim = mean(unlist(sim.vals)),
sd.sim = sd(unlist(sim.vals)))
or
sim_result %>%
unnest(sim.vals) %>%
group_by(Name) %>%
summarise(mean=mean(sim.vals),
sd=sd(sim.vals))
or
sim_result %>%
summarise(quantiles = list(enframe(quantile(unlist(sim.vals))))) %>%
unnest(quantiles) %>%
mutate(name = factor(name, levels=unique(name))) %>%
spread(name, value)