public IMatrixData CombineData(IMatrixData matrixData1, IMatrixData matrixData2, Parameters parameters, ProcessInfo processInfo) { bool indicator = parameters.GetBoolParam("Indicator").Value; int otherCol = parameters.GetSingleChoiceParam("Matching column 2").Value; Average avExpression = GetAveraging(parameters.GetSingleChoiceParam("Combine expression values").Value); Average avNumerical = GetAveraging(parameters.GetSingleChoiceParam("Combine numerical values").Value); string[] q = matrixData2.StringColumns[otherCol]; string[][] w = new string[q.Length][]; for (int i = 0; i < q.Length; i++){ string r = q[i].Trim(); w[i] = r.Length == 0 ? new string[0] : r.Split(';'); w[i] = ArrayUtils.UniqueValues(w[i]); } Dictionary<string, List<int>> id2Cols = new Dictionary<string, List<int>>(); for (int i = 0; i < w.Length; i++){ foreach (string s in w[i]){ if (!id2Cols.ContainsKey(s)){ id2Cols.Add(s, new List<int>()); } id2Cols[s].Add(i); } } int pgCol = parameters.GetSingleChoiceParam("Matching column 1").Value; string[] d = matrixData1.StringColumns[pgCol]; string[][] x = new string[d.Length][]; for (int i = 0; i < d.Length; i++){ string r = d[i].Trim(); x[i] = r.Length == 0 ? new string[0] : r.Split(';'); x[i] = ArrayUtils.UniqueValues(x[i]); } int[][] indexMap = new int[x.Length][]; string[][] indicatorCol = new string[x.Length][]; for (int i = 0; i < indexMap.Length; i++){ List<int> qwer = new List<int>(); foreach (string s in x[i]){ if (id2Cols.ContainsKey(s)){ List<int> en = id2Cols[s]; qwer.AddRange(en); } } indexMap[i] = qwer.ToArray(); indexMap[i] = ArrayUtils.UniqueValues(indexMap[i]); indicatorCol[i] = indexMap[i].Length > 0 ? new[]{"+"} : new string[0]; } IMatrixData result = matrixData1.Copy(); SetAnnotationRows(result, matrixData1, matrixData2); if (indicator){ result.AddCategoryColumn(matrixData2.Name, "", indicatorCol); } { int[] exCols = parameters.GetMultiChoiceParam("Expression columns").Value; float[,] newExColumns = new float[matrixData1.RowCount, exCols.Length]; float[,] newQuality = new float[matrixData1.RowCount, exCols.Length]; bool[,] newIsImputed = new bool[matrixData1.RowCount, exCols.Length]; string[] newExColNames = new string[exCols.Length]; float[,] oldEx = matrixData2.ExpressionValues; float[,] oldQual = matrixData2.QualityValues; bool[,] oldImp = matrixData2.IsImputed; for (int i = 0; i < exCols.Length; i++) { newExColNames[i] = matrixData2.ExpressionColumnNames[exCols[i]]; for (int j = 0; j < matrixData1.RowCount; j++){ int[] inds = indexMap[j]; List<double> values = new List<double>(); List<double> qual = new List<double>(); List<bool> imp = new List<bool>(); foreach (int ind in inds) { double v = oldEx[ind, exCols[i]]; if (!double.IsNaN(v) && !double.IsInfinity(v)){ values.Add(v); double qx = oldQual[ind, exCols[i]]; if (!double.IsNaN(qx) && !double.IsInfinity(qx)){ qual.Add(qx); } bool isi = oldImp[ind, exCols[i]]; imp.Add(isi); } } newExColumns[j, i] = values.Count == 0 ? float.NaN : (float)avExpression(values.ToArray()); newQuality[j, i] = qual.Count == 0 ? float.NaN : (float)avExpression(qual.ToArray()); newIsImputed[j, i] = imp.Count != 0 && AvImp(imp.ToArray()); } } MakeNewNames(newExColNames, result.ExpressionColumnNames); AddExpressionColumns(result, newExColNames, newExColumns, newQuality, newIsImputed); } { int[] numCols = parameters.GetMultiChoiceParam("Numerical columns").Value; double[][] newNumericalColumns = new double[numCols.Length][]; string[] newNumColNames = new string[numCols.Length]; for (int i = 0; i < numCols.Length; i++){ double[] oldCol = matrixData2.NumericColumns[numCols[i]]; newNumColNames[i] = matrixData2.NumericColumnNames[numCols[i]]; newNumericalColumns[i] = new double[matrixData1.RowCount]; for (int j = 0; j < matrixData1.RowCount; j++){ int[] inds = indexMap[j]; List<double> values = new List<double>(); foreach (int ind in inds){ double v = oldCol[ind]; if (!double.IsNaN(v)){ values.Add(v); } } newNumericalColumns[i][j] = values.Count == 0 ? double.NaN : avNumerical(values.ToArray()); } } for (int i = 0; i < numCols.Length; i++){ result.AddNumericColumn(newNumColNames[i], "", newNumericalColumns[i]); } } { int[] catCols = parameters.GetMultiChoiceParam("Categorical columns").Value; string[][][] newCatColumns = new string[catCols.Length][][]; string[] newCatColNames = new string[catCols.Length]; for (int i = 0; i < catCols.Length; i++){ string[][] oldCol = matrixData2.CategoryColumns[catCols[i]]; newCatColNames[i] = matrixData2.CategoryColumnNames[catCols[i]]; newCatColumns[i] = new string[matrixData1.RowCount][]; for (int j = 0; j < matrixData1.RowCount; j++){ int[] inds = indexMap[j]; List<string[]> values = new List<string[]>(); foreach (int ind in inds){ string[] v = oldCol[ind]; if (v.Length > 0){ values.Add(v); } } newCatColumns[i][j] = values.Count == 0 ? new string[0] : ArrayUtils.UniqueValues(ArrayUtils.Concat(values.ToArray())); } } for (int i = 0; i < catCols.Length; i++){ result.AddCategoryColumn(newCatColNames[i], "", newCatColumns[i]); } } { int[] stringCols = parameters.GetMultiChoiceParam("String columns").Value; string[][] newStringColumns = new string[stringCols.Length][]; string[] newStringColNames = new string[stringCols.Length]; for (int i = 0; i < stringCols.Length; i++){ string[] oldCol = matrixData2.StringColumns[stringCols[i]]; newStringColNames[i] = matrixData2.StringColumnNames[stringCols[i]]; newStringColumns[i] = new string[matrixData1.RowCount]; for (int j = 0; j < matrixData1.RowCount; j++){ int[] inds = indexMap[j]; List<string> values = new List<string>(); foreach (int ind in inds){ string v = oldCol[ind]; if (v.Length > 0){ values.Add(v); } } newStringColumns[i][j] = values.Count == 0 ? "" : StringUtils.Concat(";", values.ToArray()); } } for (int i = 0; i < stringCols.Length; i++){ result.AddStringColumn(newStringColNames[i], "", newStringColumns[i]); } } result.Origin = "Combination"; return result; }