All Downloads are FREE. Search and download functionalities are using the official Maven repository.

prerna.reactor.frame.r.ColumnAverageReactor Maven / Gradle / Ivy

The newest version!
package prerna.reactor.frame.r;

import java.util.List;
import java.util.Map;
import java.util.Vector;

import prerna.algorithm.api.SemossDataType;
import prerna.ds.OwlTemporalEngineMeta;
import prerna.ds.r.RDataTable;
import prerna.sablecc2.om.GenRowStruct;
import prerna.sablecc2.om.PixelDataType;
import prerna.sablecc2.om.PixelOperationType;
import prerna.sablecc2.om.ReactorKeysEnum;
import prerna.sablecc2.om.execptions.SemossPixelException;
import prerna.sablecc2.om.nounmeta.NounMetadata;
import prerna.util.Utility;

public class ColumnAverageReactor extends AbstractRFrameReactor {

	/*
	 * Keys that can be passed in
	 */

	public ColumnAverageReactor() {
		this.keysToGet = new String[] { ReactorKeysEnum.COLUMNS.getKey(), ReactorKeysEnum.NEW_COLUMN.getKey() };
	}

	@Override
	public NounMetadata execute() {
		init();
		organizeKeys();
		RDataTable frame = (RDataTable) getFrame();
		String frameName = frame.getName();
		List columns = getCols(ReactorKeysEnum.COLUMNS.getKey());
		String newColName = this.keyValue.get(ReactorKeysEnum.NEW_COLUMN.getKey());
		newColName = getCleanNewColName(newColName);

		// build and run r script
		StringBuilder script = new StringBuilder();
		script.append(frameName).append("$").append(newColName).append(" <- round(((");
		int i;
		OwlTemporalEngineMeta metadata = frame.getMetaData();
		Map dataTypeMap = metadata.getHeaderToTypeMap();
		for (i = 0; i < columns.size() - 1; i++) {
			String column = columns.get(i);
			SemossDataType dataType = dataTypeMap.get(frameName + "__" + column);
			if (!Utility.isNumericType(dataType.toString())) {
				throw new IllegalArgumentException(column + " must be a numeric column");
			}
			script.append(frameName).append("$").append(column).append(" + ");
		}
		script.append(frameName).append("$").append(columns.get(i)).append(") / ");
		script.append(columns.size()).append("), digits = 2);");
		this.rJavaTranslator.runR(script.toString());
		this.addExecutedCode(script.toString());

		// check if new column exists
		String colExistsScript = "\"" + newColName + "\" %in% colnames(" + frameName + ")";
		boolean colExists = this.rJavaTranslator.getBoolean(colExistsScript);
		if (!colExists) {
			NounMetadata error = NounMetadata.getErrorNounMessage("Unable to perform average across columns");
			SemossPixelException exception = new SemossPixelException(error);
			exception.setContinueThreadOfExecution(false);
			throw exception;
		}

		// update meta data
		OwlTemporalEngineMeta metaData = frame.getMetaData();
		metaData.addProperty(frameName, frameName + "__" + newColName);
		metaData.setAliasToProperty(frameName + "__" + newColName, newColName);
		metaData.setDataTypeToProperty(frameName + "__" + newColName, SemossDataType.DOUBLE.toString());
		metaData.setDerivedToProperty(frameName + "__" + newColName, true);
		frame.syncHeaders();

		NounMetadata retNoun = new NounMetadata(frame, PixelDataType.FRAME, PixelOperationType.FRAME_HEADERS_CHANGE,PixelOperationType.FRAME_DATA_CHANGE);
		retNoun.addAdditionalReturn(NounMetadata.getSuccessNounMessage("Successfully performed average across columns."));
		return retNoun;
	}

	private List getCols(String key) {
		List columnsList = new Vector();
		GenRowStruct grs = this.store.getNoun(key);
		if (grs == null || grs.isEmpty()) {
			throw new IllegalArgumentException("Please pass at least one numeric column.");
		}
		for (int i = 0; i < grs.size(); i++) {
			columnsList.add(grs.get(i).toString());
		}
		return columnsList;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy