Results 1 to 3 of 3
Thread: Computing ranks from scores

20090722, 17:48 #1
 Join Date
 Feb 2001
 Location
 Silicon Valley, USA
 Posts
 23,112
 Thanks
 5
 Thanked 94 Times in 90 Posts
Yesterday I was viewing a chart of scores. Each column represented one judge, and each row, one contestant. I wanted to simplify the data by converting the scores to ranks, that is, for each judge, replace the highest score with 1, the next highest with 2, and so forth. The table happened to be in HTML, so I would be coding this in JavaScript, but what I need is a general idea of how best to approach the problem. Any suggestions (besides using Excel)?

20090722, 18:34 #2
 Join Date
 Mar 2002
 Posts
 84,353
 Thanks
 0
 Thanked 31 Times in 31 Posts
I'm sure there are more efficient ways, but a rather clunky way is to use a double loop for each column in which the inner loop counts the number of entries that is at least the current entry in the outer loop.
Pseudocode:
Code:for (i=1;i<=n;i++) { rank[i]=0; for (j=1;j<=n;j++) { if (element[j]>=element[i]) { rank[i]=rank[i]+1; } } }

20090722, 21:37 #3
 Join Date
 Feb 2001
 Location
 Silicon Valley, USA
 Posts
 23,112
 Thanks
 5
 Thanked 94 Times in 90 Posts
Thanks, Hans. I ended up "cheating"  I devised a way to store the row reference along with the score, by creating a decimal separated pair of values I then could sort in descending numeric order.
Code:function rankIt() { var tbl, cmax, rmax, i, j, k, points, r, s, t, v; // Create object reference to results table tbl = document.getElementsByTagName("table")[0]; // Compute highest column index to play with, and highest row index cmax = tbl.rows[0].cells.length  2; // ignore two right columns rmax = tbl.rows.length; for (i=2; i<cmax; i++) { // Skip first two columns // Create blank array for this judge points = new Array(); for (j=1; j<rmax; j++) { // Skip first row // Mutiply score by 100 and truncate v = parseInt(parseFloat(tbl.rows[j].cells[i].firstChild.firstChild.nodeValue) * 100); // Concatenate score, a . and the row index and add to 0based array points[j1] = v.toString() + "." + j.toString(); } // Sort in numeric descending order points.sort(desc); for (k=0; k<points.length; k++) { // Create an empty span to hold the rank s = document.createElement("span"); // Compute the rank from the index of the sorted array, // adjust for a tie with the previous item (doesn't handle nway ties with n>2) if (k<1) { t = document.createTextNode(k+1); } else { if (points[k].split(".")[0] == points[k1].split(".")[0]) { t = document.createTextNode(k); } else { t = document.createTextNode(k+1); } } // Retrieve the row number r = points[k].split(".")[1]; // Insert a line break element tbl.rows[r].cells[i].firstChild.insertBefore(document.createElement("br"), tbl.rows[r].cells[i].firstChild.firstChild); // Append rank to blank span s.appendChild(t); // Insert span containing rank tbl.rows[r].cells[i].firstChild.insertBefore(s, tbl.rows[r].cells[i].firstChild.firstChild); } } } function desc(a, b ) {return ba;}