title: R randomForest subsetting can't get rid of factor levels
body: <blockquote>
    <p><strong>Possible Duplicate:</strong><br>
    <a href="https://stackoverflow.com/questions/1195826/dropping-factor-levels-in-a-subsetted-data-frame-in-r">dropping factor levels in a subsetted data frame in R</a>  </p>
  </blockquote>
  
  
  
  <p>I'm trying to use a randomForest to predict sales.  I have 3 variables, one of which is a factor variable for storeId.  I know that there are levels in the test set that are NOT in the training set.  I'm trying to get a prediction for only levels present in the training set but can't get it to look past the new factor levels. </p>
  
  <p>Here's what I've tried so far:</p>
  
  <pre><code>require(randomForest)
  train &lt;- data.frame(sales = runif(10)*1000, storeId = factor(seq(1,10,1)), dat1 =runif(10), dat2 = runif(10)*10)
  test &lt;- data.frame(storeId = factor(seq(2,11,1)), dat1 =runif(10), dat2 = runif(10)*10)
  
  
  &gt; train 
        sales storeId      dat1     dat2
  1  414.7791       1 0.7830092 7.178577
  2  719.5965       2 0.9512138 6.153049
  3  887.3197       3 0.6879827 5.413556
  4  706.5828       4 0.4486214 4.955400
  5  326.8189       5 0.0944885 6.900802
  6  840.5920       6 0.1917165 8.044636
  7  936.2206       7 0.2173074 4.835064
  8  244.6947       8 0.6526765 6.516790
  9  818.8747       9 0.3317644 9.651675
  10 631.6104      10 0.6998037 8.443972
  &gt; test 
     storeId      dat1     dat2
  1        2 0.7513645 3.442052
  2        3 0.2862487 3.196189
  3        4 0.4971865 6.074281
  4        5 0.8631945 8.766129
  5        6 0.3848105 5.001426
  6        7 0.9032262 7.018274
  7        8 0.1560501 4.523618
  8        9 0.3461597 5.551672
  9       10 0.1318464 3.092640
  10      11 0.6587270 1.348623
  
  
  &gt; RF1 &lt;- randomForest(train[,c("storeId","dat1","dat2")], train$sales, do.trace=TRUE,
  + importance=TRUE,ntree=5,,forest=TRUE)
       |      Out-of-bag   |
  Tree |      MSE  %Var(y) |
     1 | 2.915e+05   544.44 |
     2 | 1.825e+05   340.84 |
     3 |  2.1e+05   392.19 |
     4 | 1.914e+05   357.38 |
     5 | 1.809e+05   337.78 |
  &gt; pred &lt;- predict(RF1, test)
  Error in predict.randomForest(RF1, test) : 
    New factor levels not present in the training data
  </code></pre>
  
  <p>This part makes sense.</p>
  
  <p>So I try this:</p>
  
  <pre><code>&gt; test2 &lt;- test[test$storeId != 11,]
  &gt; pred &lt;- predict(RF1, test2)
  Error in predict.randomForest(RF1, test2) : 
    New factor levels not present in the training data
  </code></pre>
  
  <p>So I try this:</p>
  
  <pre><code>&gt; levels(test2$storeId)
   [1] "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11"
  </code></pre>
  
  <p>And the "11" level is still in there.</p>
  
  <p>Next I try this:</p>
  
  <pre><code>&gt; test2$storeId &lt;- as.numeric(as.character(test2$storeId))
  &gt; test2$storeId &lt;- factor(test2$storeId)
  &gt; pred &lt;- predict(RF1, test2)
  Error in predict.randomForest(RF1, test2) : 
    Type of predictors in new data do not match that of the training data.
  </code></pre>
  
  <p>despite the fact that things look ok here:</p>
  
  <pre><code>&gt; levels(test2$storeId)
  [1] "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
  </code></pre>
  
  <p>Any suggestions for getting it to predict on just stores without the "11" level?</p>
  
  <p>EDIT:</p>
  
  <pre><code>&gt; test2$storeId &lt;- as.factor(as.character(test2$storeId))
  &gt; pred &lt;- predict(RF1, test2)
  Error in predict.randomForest(RF1, test2) : 
    Type of predictors in new data do not match that of the training data.
  &gt; 
  &gt; test2$storeId &lt;- drop.levels(test2$storeId)
  &gt; pred &lt;- predict(RF1, test2)
  Error in predict.randomForest(RF1, test2) : 
    Type of predictors in new data do not match that of the training data.
  
  
  &gt; str(train)
  'data.frame':   10 obs. of  4 variables:
   $ sales  : num  800 679 589 812 384 ...
   $ storeId: Factor w/ 10 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10
   $ dat1   : num  0.5148 0.5567 0.9871 0.0071 0.736 ...
   $ dat2   : num  8.501 2.994 2.948 0.519 1.746 ...
  &gt; str(test)
  'data.frame':   10 obs. of  3 variables:
   $ storeId: Factor w/ 10 levels "2","3","4","5",..: 1 2 3 4 5 6 7 8 9 10
   $ dat1   : num  0.0975 0.7435 0.7055 0.2085 0.2944 ...
   $ dat2   : num  5.96 6.84 3.96 8.93 8.62 ...
  &gt; str(test2)
  'data.frame':   9 obs. of  3 variables:
   $ storeId: Factor w/ 9 levels "2","3","4","5",..: 1 2 3 4 5 6 7 8 9
   $ dat1   : num  0.0975 0.7435 0.7055 0.2085 0.2944 ...
   $ dat2   : num  5.96 6.84 3.96 8.93 8.62 ...
  </code></pre>