title: R: how do I output the factor level from a for loop rather than the index?
body: <p>I have a data frame that I am running a Monte Carlo simulation on, using for loops, to generate a simulated distribution. As I am testing the simulation code, I am just accessing the first observation in the data frame:</p>
  
  <pre><code>Male.MC &lt;-c()
  for (j in 1:100){
      for (i in 1:1)  {
          # u2 &lt;- Male.DistF$Male.stddev_u2[i] * rnorm(1, mean = 0, sd = 1)
          u2 &lt;- Male.DistF$RndmEffct[i] * rnorm(1, mean = 0, sd = 1)
          mc_bca &lt;- Male.DistF$lmefits[i] + u2
          temp &lt;- Lambda.Value*mc_bca+1
          ginv_a &lt;- temp^(1/Lambda.Value)
          d2ginv_a &lt;- max(0,(1-Lambda.Value)*temp^(1/Lambda.Value-2))
          mc_amount &lt;- ginv_a + d2ginv_a * Male.DistF$Male.var[i]^2 / 2
          z &lt;- c(RespondentID &lt;- Male.DistF$RespondentID[i], 
                     Male.DistF$AgeFactor[i], Male.DistF$SampleWeight[i], 
          Male.DistF$Male.var[i], Male.DistF$lmefits[i], u2, mc_amount) 
          Male.MC &lt;- as.data.frame(rbind(Male.MC,z))
      }
  }
  colnames(Male.MC) &lt;- c("RespondentID", "AgeFactor", 
                         "SampleWeight", "VarByAge", 
                         "lmefits", "u2", "mc_amount")
  </code></pre>
  
  <p>The code works beautifully except that <code>Male.DistF$RespondentID</code> is a factor and I don't get the factor level output, but instead get the factor index, in this case I get <code>1</code> as the <code>RespondentID</code>s are in ascending order in the <code>Male.DistF</code> data frame. I have the same problem with <code>AgeFactor</code>, where I get the index rather than the factor level.</p>
  
  <pre><code>head(Male.MC)
    RespondentID AgeFactor SampleWeight  VarByAge  lmefits         u2 mc_amount
  z            1         3    0.4952835 0.4189871 15.22634  0.2334501 11582.681
  2            1         3    0.4952835 0.4189871 15.22634  0.3205741 11984.220
  3            1         3    0.4952835 0.4189871 15.22634 -0.5674165  8420.678
  4            1         3    0.4952835 0.4189871 15.22634 -0.5426489  8505.421
  5            1         3    0.4952835 0.4189871 15.22634  0.4878695 12790.565
  6            1         3    0.4952835 0.4189871 15.22634  0.1556925 11234.583
  </code></pre>
  
  <p>How can I make the `Male.MC1 data frame contain the factor levels for those two variables? I have tried:</p>
  
  <pre><code>z &lt;- c(RespondentID &lt;- as.character(Male.DistF$RespondentID[i]), 
         Male.DistF$AgeFactor[i], Male.DistF$SampleWeight[i], 
         Male.DistF$Male.var[i], Male.DistF$lmefits[i], u2, mc_amount)
  </code></pre>
  
  <p>and</p>
  
  <pre><code>z &lt;- c((as.character(Male.DistF$RespondentID[i])), 
         Male.DistF$AgeFactor[i], Male.DistF$SampleWeight[i], 
         Male.DistF$Male.var[i], Male.DistF$lmefits[i], u2, mc_amount)
  </code></pre>
  
  <p>to fix the <code>RespondentID</code> output, but I am doing something wrong with that syntax and it's trying to convert all the output to factors:</p>
  
  <pre><code>There were 50 or more warnings (use warnings() to see the first 50)
  str(Male.MC)
  'data.frame':   100 obs. of  7 variables:
  $ RespondentID: Factor w/ 1 level "100020": 1 1 1 1 1 1 1 1 1 1 ...
  ..- attr(*, "names")= chr  "z" "" "" "" ...
  $ AgeFactor   : Factor w/ 1 level "3": 1 1 1 1 1 1 1 1 1 1 ...
  ..- attr(*, "names")= chr  "z" "" "" "" ...
  $ SampleWeight: Factor w/ 1 level "0.495283471": 1 1 1 1 1 1 1 1 1 1 ...
  ..- attr(*, "names")= chr  "z" "" "" "" ...
  $ VarByAge    : Factor w/ 1 level "0.418987052181831": 1 1 1 1 1 1 1 1 1 1 ...
  ..- attr(*, "names")= chr  "z" "" "" "" ...
  $ lmefits     : Factor w/ 1 level "15.2263403968895": 1 1 1 1 1 1 1 1 1 1 ...
  ..- attr(*, "names")= chr  "z" "" "" "" ...
  $ u2          : Factor w/ 1 level "-0.100954008424162": 1 NA NA NA NA NA NA NA NA NA ...
  ..- attr(*, "names")= chr  "z" "" "" "" ...
  $ mc_amount   : Factor w/ 1 level "10151.4582133747": 1 NA NA NA NA NA NA NA NA NA ...
  ..- attr(*, "names")= chr  "z" "" "" "" ...
  </code></pre>
  
  <p>For testing, here is the first couple of rows of the input data frame <code>Male.DistF</code>:</p>
  
  <pre><code>     AgeFactor RespondentID SampleWeight IntakeAmt   RndmEffct NutrientID Gender Age BodyWeight  IntakeDay BoxCoxXY  lmefits      lmeres   TotWts   GrpWts NumSubjects TotSubjects  Male.var
  1725     9to13       100020    0.4952835 12145.852  0.30288536        267      1  12       51.6 Day1Intake 15.61196 15.22634  0.27138449 2291.827 763.0604         525        2249 0.4189871
  203     14to18       100419    0.3632839  9591.953  0.02703093        267      1  14       46.3 Day1Intake 15.01444 15.31373 -0.18039624 2291.827 472.3106         561        2249 0.3365423
  </code></pre>
  
  <p><code>Lambda.Value</code> is <code>0.1</code>.
  The information on <code>Male.DistF</code> is:</p>
  
  <pre><code>str(Male.DistF)
  'data.frame':   2249 obs. of  18 variables:
  $ AgeFactor   : Ord.factor w/ 4 levels "1to3"&lt;"4to8"&lt;..: 3 4 3 4 2 2 3 1 1 3 ...
  $ RespondentID: Factor w/ 2249 levels "100020","100419",..: 1 2 3 4 5 6 7 8 9 10 ...
  $ SampleWeight: num  0.495 0.363 0.495 1.326 2.12 ...
  $ IntakeAmt   : num  12146 9592 7839 11113 7150 ...
  $ RndmEffct   : num  0.3029 0.027 0.0772 0.4667 -0.1593 ...
  $ NutrientID  : int  267 267 267 267 267 267 267 267 267 267 ...
  $ Gender      : int  1 1 1 1 1 1 1 1 1 1 ...
  $ Age         : int  12 14 11 15 6 5 10 2 2 9 ...
  $ BodyWeight  : num  51.6 46.3 46.1 63.2 28.4 18 38.2 14.4 14.6 32.1 ...
  $ IntakeDay   : Factor w/ 2 levels "Day1Intake","Day2Intake": 1 1 1 1 1 1 1 1 1 1 ...
  $ BoxCoxXY    : num  15.6 15 14.5 15.4 14.3 ...
  $ lmefits     : num  15.2 15.3 15 15.8 14.3 ...
  $ lmeres      : num  0.271 -0.18 -0.342 -0.424 -0.053 ...
  $ TotWts      : num  2292 2292 2292 2292 2292 ...
  $ GrpWts      : num  763 472 763 472 779 ...
  $ NumSubjects : int  525 561 525 561 613 613 525 550 550 525 ...
  $ TotSubjects : int  2249 2249 2249 2249 2249 2249 2249 2249 2249 2249 ...
  $ Male.var    : num  0.419 0.337 0.419 0.337 0.267 ...
  </code></pre>
  
  <p>As you can see from my <code>Male.DistF</code> data, for the 100 replicates for the first observation, in the <code>Male.MC</code> data frame I would like <code>100020</code> as the <code>RespondentID</code> (and not <code>1</code>) and <code>9to13</code> as the <code>AgeFactor</code> (and not <code>3</code>). Where have I gone wrong with my output instructions and how do I fix this? In particular, I'm not following why my attempts to use <code>as.character</code> went so badly astray as to affect the entire output. As an aside I would also welcome suggestions to speed up the loops. All I am doing is constructing 100 sets of values for each observation in my <code>Male.DistF</code> data frame.</p>