package nl.helixsoft.stats; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import nl.helixsoft.recordstream.DefaultRecordMetaData; import nl.helixsoft.recordstream.Record; import nl.helixsoft.recordstream.RecordMetaData; import nl.helixsoft.stats.impl.AbstractDataFrame; /** * A dataframe wrapper for Matrix, 2D homogeneous collection. */ public class MatrixDataFrame extends AbstractDataFrame { private Matrix<?> matrix; private Header columnHeader; private RecordMetaData rmd; private List<String> rowNames; private List<String> columnNames; /** * Create a new dataframe for a given matrix, with a given header and row names */ public static MatrixDataFrame fromMatrix(Matrix<?> in, Header columnHeader, List<String> rowNames) { MatrixDataFrame result = new MatrixDataFrame(); result.matrix = in; assert (columnHeader.size() == in.getWidth()); assert (rowNames.size() == in.getHeight()); result.columnHeader = columnHeader; result.columnNames = new ArrayList<String>(); for (int i = 0; i < columnHeader.size(); ++i) { result.columnNames.add(columnHeader.getColumnName(i)); } result.rmd = new DefaultRecordMetaData(result.columnNames); result.rowNames = rowNames; return result; } @Override public RecordMetaData getMetaData() { return rmd; } @Override public DataFrame cut(int... columnIdx) { // TODO Auto-generated method stub return null; } @Override public DataFrame cut(String... columnIdx) { // TODO Auto-generated method stub return null; } @Override public DataFrame select(int... rowIdx) { // TODO Auto-generated method stub return null; } @Override public DataFrame select(List<Integer> rowIdx) { // TODO Auto-generated method stub return null; } @Override public DataFrame merge(DataFrame that, int onThisColumn, int onThatColumn) { // TODO Auto-generated method stub return null; } @Override public List<String> getColumnNames() { return columnNames; } @Override public int getColumnIndex(String columnName) { return rmd.getColumnIndex(columnName); } @Override public <T> DataFrame cbind(List<T> column) { // TODO Auto-generated method stub return null; } @Override public DataFrame rbind(Object... row) { // TODO Auto-generated method stub return null; } @Override public Iterable<Record> asRecordIterable() { return new Iterable<Record>() { @Override public Iterator<Record> iterator() { return new Iterator<Record>() { int pos = 0; @Override public boolean hasNext() { return pos < matrix.getHeight(); } @Override public Record next() { return getRow(pos++); } @Override public void remove() { throw new UnsupportedOperationException("Can't remove from a MatrixDataFrame"); } }; } }; } @Override public int getColumnCount() { return matrix.getWidth(); } @Override public String getColumnName(int col) { return columnNames.get(col); } @Override public int getRowCount() { return matrix.getHeight(); } @Override public Object getValueAt(int row, int col) { return matrix.get(row, col); } @Override public void setValueAt(Object value, int row, int col) { matrix.set(row, col, value); } @Override public List<String> getRowNames() { return rowNames; } @Override public String getRowName(int rowIx) { return rowNames.get(rowIx); } @Override public Object getColumnHeader(int colIx) { return columnHeader.get(colIx); } @Override public Header getColumnHeader() { return columnHeader; } @Override public DataFrame setColumnHeader(int colIx, String value) { columnHeader.set(colIx, value); return this; } }