public void ProcessData(IMatrixData mdata, Parameters param, ref IMatrixData[] supplTables, ref IDocumentData[] documents, ProcessInfo processInfo) { var name = param.GetParam <string>("Name").Value; var keep = param.GetParam <bool>("Keep original columns").Value; var choice = param.GetParam <int[]>("Columns").Value; var strategy = Strategies[param.GetParam <int>("Strategy").Value]; var combiner = GetCombiner(strategy); var columns = choice.Select(mdata.GetCategoryColumnAt).ToArray(); var n = mdata.RowCount; var values = new string[n][]; for (int i = 0; i < mdata.RowCount; i++) { var row = columns.Select(col => col[i]).ToArray(); values[i] = combiner(row); } if (!keep) { // if unsorted removing column will change index of other columns foreach (var col in choice.OrderByDescending(col => col)) { mdata.RemoveCategoryColumnAt(col); } } mdata.AddCategoryColumn(name, "Combined column", values); }