package water.rapids.ast.prims.mungers; import water.fvec.Frame; import water.fvec.Vec; import water.rapids.Env; import water.rapids.Val; import water.rapids.ast.AstRoot; import water.rapids.vals.ValFrame; import water.rapids.ast.AstPrimitive; import water.util.VecUtils; /** * Convert to a factor/categorical */ public class AstAsFactor extends AstPrimitive { @Override public String[] args() { return new String[]{"ary"}; } @Override public int nargs() { return 1 + 1; } // (as.factor col) @Override public String str() { return "as.factor"; } @Override public ValFrame apply(Env env, Env.StackHelp stk, AstRoot asts[]) { Frame ary = stk.track(asts[1].exec(env)).getFrame(); Vec[] nvecs = new Vec[ary.numCols()]; // Type check - prescreen for correct types for (Vec v : ary.vecs()) if (!(v.isCategorical() || v.isString() || v.isNumeric())) throw new IllegalArgumentException("asfactor() requires a string, categorical, or numeric column. " + "Received " + ary.anyVec().get_type_str() + ". Please convert column to a string or categorical first."); Vec vv; for (int c = 0; c < nvecs.length; ++c) { vv = ary.vec(c); try { nvecs[c] = vv.toCategoricalVec(); } catch (Exception e) { VecUtils.deleteVecs(nvecs, c); throw e; } } return new ValFrame(new Frame(ary._names, nvecs)); } }