R/grouping_nodes.R

grouping_nodes = function (connections = NULL) {

  # TODO: Fix case when threshold = 0
  # Modification of connections colnames
  # TODO: Refine the code in the functions that use this DS
  # colnames(connections) = c("row","col")

  # List of id elements
  simplificationMatrix = as.data.frame( unique(c(connections$row, connections$col)) );
  colnames(simplificationMatrix) = "id"

  # List of ids to iterate
  possibleNodes = as.numeric(simplificationMatrix$id)
  selectedNodes = vector()

  candidates = table( c(connections$row, connections$col) )
  candidatesMatrix = as.data.frame(cbind(
    as.numeric(rownames(candidates)), as.matrix(candidates)
    ));
  colnames(candidatesMatrix) = c("id","count");

  candidatesMatrix = merge(candidatesMatrix, simplificationMatrix, all = TRUE)
  candidatesMatrix$count[is.na(candidatesMatrix$count) == TRUE] = 0
  candidatesMatrix = candidatesMatrix[order(candidatesMatrix$count, decreasing = TRUE),]

  while (length(possibleNodes) > 0) {
    row = candidatesMatrix$id[1]
    if (length(selectedNodes) == 0) {
      subset = connections[(connections$row == row) | (connections$col == row),]; head(subset)
    } else {
      subset = connections[((connections$row == row) | (connections$col == row)) &
                      (!(connections$row %in% selectedNodes)),]; head(subset)
    }
    if (nrow(subset) > 0) {
      values = unique(c(subset$row, subset$col))
    } else {
      values = row
    }
    simplificationMatrix$nodes[(simplificationMatrix$id %in% values) & !(simplificationMatrix$id %in% selectedNodes)] = row
    possibleNodes = possibleNodes[!(possibleNodes %in% values)]
    candidatesMatrix = candidatesMatrix[!(candidatesMatrix$id %in% values),]
    selectedNodes = c(selectedNodes,values)
  }
  return(simplificationMatrix)
}
danielalcaide/mclean documentation built on May 28, 2019, 7:51 p.m.